MVC с рисунком декоратора - PullRequest
3 голосов
/ 05 мая 2011

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

Итак, у меня есть следующее:

SimpleModalWindowController.class
SimpleModalWindowModel.class
SimpleModalWindowView.class

EDIT: Вопрос: Возможно ли реализовать шаблон декоратора на этом для новых реализаций ModalWindows или я должен идти с наследованием? У меня будет много разных окон, и я хотел бы объединить некоторые из них в будущем.

Если я пойду по шаблону декоратора, какой класс будет абстрактным?

Будет ли это класс, который объединяет все вышеперечисленные классы, такие как SimpleModal.class, чтобы установить их как абстрактный класс, или у меня более одного абстрактного класса?

Я, очевидно, новичок в этом паттерне и получил только средние ООП-навыки, поэтому, пожалуйста, наберитесь терпения.

Спасибо за любую помощь.

/ Marthin

Ответы [ 2 ]

1 голос
/ 05 мая 2011

Лично я бы реализовал это как декоратор. Я обычно предпочитаю композицию наследованию по ряду причин . Тем самым я бы сделал что-то вроде:

class ExtendedModalWindowModel {
   private ModalWindowModel model;
   public ExtendedModalWindowModel(ModalWindowModel model) {
      if (model == null) throw IllegalArgumentException("...");
      this.model = model;
   }

   // delegate common methods to the parent
   public int getSize() {
      // you could also put additional functionality here...
      return model.getSize();
   }

   // implement new functionality on the decorator
   public void doNewThings() {
      // ...
   }
}

Если ваши декорированные классы реализуют tnterfaces, вы должны также реализовать их в декораторе (но все равно делегировать декорированному экземпляру для их реализации - если вы не хотите расширять или переопределять базовую функциональность).

Хорошим примером композиции является реализация ввода / вывода в Java: http://download.oracle.com/javase/1.4.2/docs/api/java/io/InputStream.html

1 голос
/ 05 мая 2011

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

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

Так будет реализован декоратор, который вам не нужен.Я парень на C #, поэтому синтаксис может быть не совсем правильным.

abstract class ModalWindowModel
{
  protected ModalWindowModel modalWindowModel; //This can be any class implementing/derived from ModalWindowModel
}

class SimpleModalWindowModel extends ModalWindowModel
{
 SimpleModalWindowModel(ModalWindowModel modalWindowModel)
 {
  this.modalWindowModel = modalWindowModel;
 }


 // your other code goes here
}

class FancyModalWindowModel extends ModalWindowModel
{
 FancyModalWindowModel(ModalWindowModel modalWindowModel)
 {
  this.modalWindowModel = modalWindowModel;
 }

 // your other code goes here
}

...
// Usage
ModalWindowModel simpleModalWindowModel = new SimpleModalWindowModel(null);
ModalWindowModel fancyModalWindowModel = new FancyModalWindowModel(simpleModalWindowModel);
....
...