在我正在进行的项目中,我们拥有严格的MVC结构。我想在一些模态窗口(微小的弹出窗口)中添加一个装饰器模式,用于那些我需要一些额外功能的实现。
所以我基本上有以下内容:
SimpleModalWindowController.class
SimpleModalWindowModel.class
SimpleModalWindowView.class
修改 问题:对于新的ModalWindows实现,是否可以为此实现装饰器模式,还是应该继承?我将有许多不同的窗口,我想在未来结合一些功能。
如果我选择装饰模式,那么抽象的类是什么类?
它是否是一个将所有上述类(如SimpleModal.class)组合起来将它们设置为抽象类的类,还是我有一个以上的抽象类?
我显然对这种模式不熟悉并且只获得了普通的OOP技能,所以请耐心等待。
感谢您的帮助。
/ Marthin
答案 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