Вызов методов в зависимости от некоторых настроек? - PullRequest
0 голосов
/ 02 мая 2011

У меня есть некоторый код, который выглядит следующим образом:

if(someCondition)
{
    SomeClass1.DoSomething();
    SomeClass2.DoSomethingElse();
    SomeClass3.DoSomethingElseAgain();
}

if(someOtherCondition)
{
    SomeClass4.WhatEver();
}

Теперь иногда нужно вызывать все эти методы, иногда только некоторые.Например, иногда я хочу только позвонить

SomeClass2.DoSomethingElse();
SomeClass3.DoSomethingElseAgain();

Остальные не должны вызываться.Есть хороший шаблон или трюк для достижения этого?

Спасибо: -)

Ответы [ 3 ]

3 голосов
/ 02 мая 2011

Шаблон Стратегии будет хорошо работать в этой ситуации: http://en.wikipedia.org/wiki/Strategy_pattern

Пример:

class StrategyExample {

    public static void main(String[] args) {

        Context context;

        context = new Context(new SomeCondition());
        context.executeStrategy();

        context = new Context(new SomeOtherCondition());
        context.executeStrategy();
    }
}

// The classes that implement a concrete strategy should implement this. The context class uses this to call the concrete strategy
interface Strategy {
    void DoSomething(); 
}

// Implements the algorithm using the strategy interface
class SomeCondition implements Strategy {

    public void DoSomething() {
        // some condition code
    }
}

// Implements the algorithm using the strategy interface
class SomeOtherCondition implements Strategy {

    public void DoSomething() {
        // dome other condition code
    }
}

// Configured with a concrete strategy object
class Context {

    private Strategy strategy;

    // Constructor
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        strategy.DoSomething();
    }
}
3 голосов
/ 02 мая 2011

Вы можете создать List<Action>, и для каждого из условий (часть if(someCondition)) добавить методы, которые вы хотите вызвать, в список действий, а затем в конце цикла выполнить действия ивыполнить каждый из них.

Если ваши методы не соответствуют шаблону Action<T> (ноль или один параметр, не возвращает значение), вы можете создать другой пользовательский делегат, который будет действовать таким же образом.

И вот вам некоторый псевдокод:

static void Main(string[] args)
{
    List<Action> actionList = new List<Action>();

    if (true)
    {
        actionList.Add(new Action(DoSomething));
    }
    // etc.

    foreach (Action a in actionList)
    {
        a();
    }
}

static void DoSomething()
{
    // Code to do something.
}

Я знаю, что это кажется более длинным, более замысловатым способом использования подхода if / else из поста ОП, но в некоторых случаях это можетна самом деле быть лучше дизайн (просто не во всех случаях).Трудно понять, что будет хорошо работать, так как ОП была такой расплывчатой.

0 голосов
/ 02 мая 2011

Я думаю, вы можете использовать блок регистра переключателей, как показано ниже,

switch (ext.ToLower ()) {case ".htm": case ".html": type = "text / HTML";перерыв;

            case ".txt":
                type = "text/plain";
                break;

            case ".doc":
            case ".rtf":
                type = "Application/msword";
                break;
            case ".xls":
                type = "application/vnd.ms-excel";
                break;
            case ".xlsx":
                type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                break;
        }
...