带有Decorator模式的MVC

时间:2011-05-05 09:10:30

标签: java oop model-view-controller design-patterns decorator

在我正在进行的项目中,我们拥有严格的MVC结构。我想在一些模态窗口(微小的弹出窗口)中添加一个装饰器模式,用于那些我需要一些额外功能的实现。

所以我基本上有以下内容:

SimpleModalWindowController.class
SimpleModalWindowModel.class
SimpleModalWindowView.class

修改 问题:对于新的ModalWindows实现,是否可以为此实现装饰器模式,还是应该继承?我将有许多不同的窗口,我想在未来结合一些功能。

如果我选择装饰模式,那么抽象的类是什么类?

它是否是一个将所有上述类(如SimpleModal.class)组合起来将它们设置为抽象类的类,还是我有一个以上的抽象类?

我显然对这种模式不熟悉并且只获得了普通的OOP技能,所以请耐心等待。

感谢您的帮助。

/ Marthin

2 个答案:

答案 0 :(得分:1)

我不认为这有资格作为装饰模式。您要做的是创建具有特化(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);
....

答案 1 :(得分:1)

我个人将它作为装饰者实现。我通常更喜欢variety of reasons的组合而不是继承。因此我会做类似的事情:

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() {
      // ...
   }
}

如果您的修饰类实现了接口,您还应该在装饰器中实现它们(但仍然委托装饰实例进行实现 - 除非您想扩展或覆盖基本功能)。

组合的一个很好的例子是在java中实现I / O:http://download.oracle.com/javase/1.4.2/docs/api/java/io/InputStream.html