Динамически создавать цепочку декораторов - PullRequest
3 голосов
/ 09 ноября 2011

У меня есть цепочка декораторов, которая выглядит так при первоначальном создании:

IType calculator = new TypeADecorator(
                            new TypeBDecorator(
                                    new TypeCDecorator(
                                        new MyCalculator())));

Каждый из этих декораторов просматривает базу данных, чтобы получить часть данных, которая используется в расчете

Однако не все эти декораторы будут использоваться каждый раз. Следовательно, потенциально могут быть избыточные вызовы базы данных, которые ничего не возвращают

Так что я думаю, что было бы лучше динамически создать цепочку декораторов, основанную на том, какие из них используются

1010 *, например *

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

bool useTypeA;
bool useTypeB;
bool useTypeC;

Смогу ли я как-то динамически построить необходимую цепочку?

Имейте в виду, что весьма вероятно, что другие декораторы будут добавляться на протяжении всего жизненного цикла приложения, поэтому я хотел бы придумать что-то, что является достаточно гибким. Кроме того, хотя здесь только три декоратора, в действительности на данный момент используется около 8

Ответы [ 3 ]

4 голосов
/ 09 ноября 2011

Да, теперь вам нужно прочитать о Pattern Builder .

0 голосов
/ 10 ноября 2011

Часть, которая немного сложна, состоит в том, что вы используете свой конструктор для украшения (обтекания / прикрепления) внутреннего объекта.Если у вас был метод Decorate (IType inner), то можно использовать этот простой код:

List<IType> decorators = new List<IType>();

if (useTypeA)
   decorators.Add(new TypeADecorator());
if (useTypeB)
   decorators.Add(new TypeBDecorator());
if (useTypeC)
   decorators.Add(new TypeCDecorator());
if (useTypeD)
   decorators.Add(new TypeDDecorator());


IType calculator = new MyCalculator();

foreach (IType dec in decorators)
{
   calculator = dec.Decorate(calculator);
}

Чтобы сохранить метод на основе конструктора, используйте это:

List<Type> decoratorTypes = new List<Type>();

if (useTypeA)
   decoratorTypes.Add(typeof(TypeADecorator));
if (useTypeB)
   decoratorTypes.Add(typeof(TypeBDecorator));
if (useTypeC)
   decoratorTypes.Add(typeof(TypeCDecorator));
if (useTypeD)
   decoratorTypes.Add(typeof(TypeDDecorator));

IType calculator = new MyCalculator();

foreach (Type decType in decoratorTypes)
{
   calculator = Activator.CreateInstance(decType, calculator);
}

порядок имеет значение, вы должны знать о порядке добавления элемента в список.

0 голосов
/ 09 ноября 2011

Я предполагаю, что поиск в базе данных выполняется в конструкторе декараторов, не будут ли они отложены? Возможно ли будет спроектировать ваши декораторы так, чтобы они выполняли поиск в базе данных всякий раз, когда им действительно нужно значение из БД?

...