2011-05-05 90 views
3

在一个我正在开发的项目中,我们拥有严格的MVC结构。我想添加一个装饰模式的一些模式窗口(微小的弹出窗口)为那些实现我whant一些额外的功能。MVC与Decorator模式

所以我basicly具备以下条件:

SimpleModalWindowController.class 
SimpleModalWindowModel.class 
SimpleModalWindowView.class 

编辑: 问题:是否有可能实施新ModalWindows implemenations在这样的装饰图案或我应该去继承?我会有很多不同的窗口,我希望将来可以结合一些功能。

如果我按装饰模式走,什么类应该是抽象类?

它是一个类将SimpleModal.class等所有类组合成一个抽象类,或者我有多个抽象类?

我对这种模式显然是新的,只有平均的OOP技能,所以请耐心等待。

感谢您的任何帮助。

/Marthin

+0

我不认为这有资格作为一个装饰图案。你要做的是创建具有专业化(Fancy)的继承层次结构。 – 2011-05-05 09:18:46

回答

1

我不认为这有资格作为一个装饰图案。你要做的是创建具有专业化(Fancy)的继承层次结构。

您不需要实施装饰器。你正在执行的方式看起来很好,如果这是解决设计问题。在这种情况下,您不必使用模式。

这是如何实现一个你不需要的装饰器。我是一个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

就我个人而言,我会把它作为装饰者来实现。我通常更喜欢构图而不是继承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() { 
     // ... 
    } 
} 

如果您的装饰类实现tnterfaces,你也应该实现它们的装饰(但仍委托给装修实例的执行,除非你想扩展或覆盖基功能)。

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