下面是我编写的用于覆盖类方法(使用组合)的简化代码,在这种情况下,我覆盖的方法名称是addbuttons();。类“ Screen”将按钮添加到屏幕,而类“ SubScreen”将自定义按钮添加到Screen实例。也许这不是装饰器模式的示例,因为我覆盖了功能而不是对其进行了扩展?是否有更好的方法(使用设计模式?)来实现相同的功能?
public class Driver {
public static void main(String args[]){
AddComponents add1 = new Screen();
add1.addButtons();
Screen newScreen = new Screen();
AddComponents add2 = new SubScreen(newScreen);
add2.addButtons();
}
}
public interface AddComponents {
public void addButtons();
}
public class Screen implements AddComponents{
public void addButtons() {
//Add Buttons to screen class
}
}
public class SubScreen implements AddComponents{
private Screen screen;
public SubScreen(Screen screen){
this.screen = screen;
}
public void addButtons() {
//add different custom buttons to Screen class
}
}
最佳答案
另一种可能性是将其称为代理。装饰器和代理在技术上非常相似-区别-在大多数情况下-不是技术性的,而是基于意图的。
您的示例稍微少了一点,因此很难正确猜出意图。
编辑
在详细级别上:Screen
和SubScreen
不共享任何代码。如果您开始同时向实现和通用接口AddComponents
添加方法,则可能会发现
您必须同时复制Screen
和SubScreen
中的代码(或委托给Screen
)和
必须将方法添加到AddComponents
中,从而使该接口的名称不正确。
如果两个屏幕类在抽象逻辑级别和实现级别上都相似,则具有两个派生类的类AbstractScreen
会更好。要使模式说话恢复原状:在AbstractScreen
中使用工厂方法来专门化有关不同按钮的行为。
在您当前的代码中,有一件事很奇怪:为什么仍然定义了方法addButton
?只需将按钮添加到适当的构造函数中,因为无论如何用户都必须调用addButtons
并且该方法没有参数。
没有解释的另一点是:SubScreen
引用了未使用的Screen
。为什么?在所有涉及的类Screen
,SubScreen
和AddComponents
中是否会有更多方法?每个方法是SubScreen
中的Screen
委托还是仅其中一半?
您会看到-有很多可能性我们都不知道,示例代码中没有显示,但是非常重要。我确信您的头上有很多细节,上面写着“建议的内容将无法正常工作,因为我想在不久的将来做到这一点。遗憾的是,如果没有更多的文字说明,我们将无法使您的想法进入该站点。 :-)
关于java - 这是装饰器图案的变化还是图案的变化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7666972/