Статьи

Вертикальная и горизонтальная отделка

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

Квартира (1960) Билли Уайлдера

Квартира (1960) Билли Уайлдера

Допустим, у меня есть список номеров:

1
2
3
interface Numbers {
  Iterable<Integer> iterate();
}

Теперь я хочу создать список, в котором будут только нечетные, уникальные, положительные и отсортированные числа. Первый подход вертикальный (я только что придумал это название):

01
02
03
04
05
06
07
08
09
10
11
12
13
Numbers numbers = new Sorted(
  new Unique(
    new Odds(
      new Positive(
        new ArrayNumbers(
          new Integer[] {
            -1, 78, 4, -34, 98, 4,
          }
        )
      )
    )
  )
);

Второй подход — горизонтальный (опять же, имя, которое я придумал):

01
02
03
04
05
06
07
08
09
10
11
12
13
Numbers numbers = new Modified(
  new ArrayNumbers(
    new Integer[] {
      -1, 78, 4, -34, 98, 4,
    }
  ),
  new Diff[] {
    new Positive(),
    new Odds(),
    new Unique(),
    new Sorted(),
  }
);

Увидеть разницу? Первый подход декорирует ArrayNumbers «по вертикали», добавляя функциональность через составные декораторы « Positive , « Odds , « Unique и « Sorted .

Второй подход представляет новый интерфейс Diff , который реализует базовую функциональность итерации чисел через экземпляры Positive , Odds , Unique и Sorted :

1
2
3
interface Diff {
  Iterable<Integer> apply(Iterable<Integer> origin);
}

Для пользователя numbers оба подхода одинаковы. Разница только в дизайне. Какой из них лучше и когда? Кажется, что вертикальное декорирование проще в реализации и больше подходит для небольших объектов, которые предоставляют всего несколько методов.

Что касается моего опыта, я всегда склонен начинать с вертикального декорирования, поскольку его легче реализовать, но в конечном итоге перейти к горизонтальному, когда число декораторов начинает расти.

Ссылка: Вертикальное и горизонтальное оформление от нашего партнера JCG Егора Бугаенко в блоге About Programming .