Это хорошее использование шаблона декоратора? - PullRequest
0 голосов
/ 22 марта 2011

Я должен написать 2 текстовых файла для клиента. Файлы содержат информацию из нашей БД. Наше приложение используется многими клиентами, и поэтому не каждый файл будет написан для каждого клиента. Некоторые просто получают первый файл, а некоторые также 2-й. Структура файла отличается от клиента к клиенту, поэтому я создал абстрактный класс с абстрактным методом Write и определенным классом для каждого клиента, который использует метод Write. Это для первого файла, который предназначен для всех клиентов, только с разным содержанием и структурой.

abstract class CustomerWriter
{
    //...
    abstract Write();
    //...  
}

Тогда у меня есть 2 класса, которые унаследованы от этого. Это хорошо, я думаю. Теперь для второго файла, который должен быть написан только для некоторых клиентов ... это хорошая идея использовать здесь шаблон декоратора и украсить класс для первого файла? Это не тот же базовый класс (CustomerWriter). Я не уверен, что это слишком много для моего случая, поэтому я спрашиваю.

Как бы я украсил определенный класс для первого файла?

Спасибо: -)

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

Если вы не можете выполнить рефакторинг второго устройства записи для совместного использования общего базового класса или интерфейса, вы можете использовать шаблон адаптера.Вы могли бы написать адаптер, который заставляет второго писателя выглядеть как CustomerWriter.Таким образом, ваши клиенты могут использовать один общий базовый класс или интерфейс (даже лучше).Затем вы можете использовать контейнер IoC, чтобы иметь возможность настроить, какой экземпляр создаются экземплярами клиентов.

Адаптер будет выглядеть примерно так:

public SecondWriterAdapter : CustomerWriter
{
    private SecondWriter writerInstance;
    public SecondWriterAdapter(SecondWriter writerInstance)
    {
        this.writerInstance = writerInstance;
    }

    public override void Write()
    {
        writerInstance.someExistingWriteMethod();
    } 
}
0 голосов
/ 22 марта 2011

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

Обновление : для этого вы можете использовать контейнер IoC, но просто

public class FileWriterRegistry
{
   public void Register(CustomerWriter writer)
   {
   }

   public void WriteAllFiles()
   {
       ... call Write() for each registered writer
   }
}

может подойти.

...