下面是我编写的用于覆盖类方法(使用组合)的简化代码,在这种情况下,我覆盖的方法名称是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
    }

}

最佳答案

另一种可能性是将其称为代理。装饰器和代理在技术上非常相似-区别-在大多数情况下-不是技术性的,而是基于意图的。
您的示例稍微少了一点,因此很难正确猜出意图。

编辑

在详细级别上:ScreenSubScreen不共享任何代码。如果您开始同时向实现和通用接口AddComponents添加方法,则可能会发现


您必须同时复制ScreenSubScreen中的代码(或委托给Screen)和
必须将方法添加到AddComponents中,从而使该接口的名称不正确。


如果两个屏幕类在抽象逻辑级别和实现级别上都相似,则具有两个派生类的类AbstractScreen会更好。要使模式说话恢复原状:在AbstractScreen中使用工厂方法来专门化有关不同按钮的行为。

在您当前的代码中,有一件事很奇怪:为什么仍然定义了方法addButton?只需将按钮添加到适当的构造函数中,因为无论如何用户都必须调用addButtons并且该方法没有参数。

没有解释的另一点是:SubScreen引用了未使用的Screen。为什么?在所有涉及的类ScreenSubScreenAddComponents中是否会有更多方法?每个方法是SubScreen中的Screen委托还是仅其中一半?

您会看到-有很多可能性我们都不知道,示例代码中没有显示,但是非常重要。我确信您的头上有很多细节,上面写着“建议的内容将无法正常工作,因为我想在不久的将来做到这一点。遗憾的是,如果没有更多的文字说明,我们将无法使您的想法进入该站点。 :-)

关于java - 这是装饰器图案的变化还是图案的变化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7666972/

10-13 07:13