Есть хороший шаблон дизайна для реализации дополнительных функций? - PullRequest
2 голосов
/ 25 августа 2009

Предположим, у меня есть функция, которая выполняет какую-то задачу (это в псевдокоде Python):

def doTask():
    ...

Но у меня есть несколько дополнительных функций на платформе, в результате чего код выглядит следующим образом:

def doTask():
    ...
    if FEATURE_1_ENABLED:
        ...
    if FEATURE_2_ENABLED:
        ...
    ...

К сожалению, это скорее беспорядок со многими различными дополнительными функциями, которые совпадают друг с другом. Какие шаблоны дизайна решают эту проблему?

Ответы [ 2 ]

4 голосов
/ 25 августа 2009

Вот что такое Команда и Стратегия . А также Композиция .

class Command( object ):
    def do( self ):
        raise NotImplemented

class CompositeCommand( Command, list ):
    def do( self ):
        for subcommand in self:
            subcommand.do()

class Feature_1( Command ):
    def do( self, aFoo ):
        # some optional feature.

class Feature_2( Command ):
    def do( self, aFoo ):
        # another optional feature.

class WholeEnchilada( CompositeCommand ):
    def __init__( self ):
        self.append( Feature_1() )
        self.append( Feature_2() )

class Foo( object ):
    def __init__( self, feature=None ):
        self.feature_command= feature
    def bar( self ):
        # the good stuff
        if self.feature:
            self.feature.do( self )

Вы можете создавать функции, делегировать функции, наследовать функции. Это работает очень хорошо для расширяемого набора дополнительных функций.

1 голос
/ 25 августа 2009
interface Feature{

  void execute_feature();

}

class Feature1 implements Feature{
  void execute_feature(){}
}
class Feature2 implements Feature{
  void execute_feature(){}
}

public static void main(String argv[]){

List<Feature> my_list = new List<Feature>();
my_list.Add(new Feature1());
my_list.Add(new Feature2());

for (Feature f : my_list){
  f.execute_feature();
}

}

Я думаю, что это называется паттерном стратегии

Синтаксис может быть не точным

...