Java 具有装饰器模式的MVC

Java 具有装饰器模式的MVC,java,oop,model-view-controller,design-patterns,decorator,Java,Oop,Model View Controller,Design Patterns,Decorator,在我从事的一个项目中,我们拥有严格的MVC结构。我正在考虑为那些我没有额外功能的实现在一些模式窗口(小弹出窗口)中添加一个装饰器模式 因此,我基本上有以下几点: SimpleModalWindowController.class SimpleModalWindowModel.class SimpleModalWindowView.class 编辑: 问题:对于新的ModalWindows实现,是否可以在此基础上实现一个装饰器模式,还是应该使用继承?我将有许多不同的窗口,我想在未来结合其中的一些

在我从事的一个项目中,我们拥有严格的MVC结构。我正在考虑为那些我没有额外功能的实现在一些模式窗口(小弹出窗口)中添加一个装饰器模式

因此,我基本上有以下几点:

SimpleModalWindowController.class
SimpleModalWindowModel.class
SimpleModalWindowView.class
编辑: 问题:对于新的ModalWindows实现,是否可以在此基础上实现一个装饰器模式,还是应该使用继承?我将有许多不同的窗口,我想在未来结合其中的一些功能

如果我按照装饰者模式,哪个类是抽象类

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

我显然是这个模式的新手,只掌握了普通的OOP技能,所以请耐心等待

谢谢你的帮助


/Marthin

我认为这不符合装饰图案的要求。您试图做的是创建带有专门化的继承层次结构(花式)

您不需要实现Decorator。如果这是为了解决设计问题,那么您的实现方式看起来不错。在这种情况下,您不必使用模式

这就是如何实现您不需要的装饰器。我是个C#guy,因此语法可能不完全正确

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);
....

就我个人而言,我会作为一名装饰师来实现它。一般来说,我更喜欢组合而不是继承。因此,我会这样做:

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中I/O的实现:

我认为这不符合装饰器模式。您试图做的是创建带有专门化的继承层次结构(花式)。