这是装饰图案或图案的变体吗?

时间:2011-10-05 19:57:22

标签: java design-patterns

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

}

1 个答案:

答案 0 :(得分:3)

另一种可能性是将其称为代理装饰器代理在技术上非常相似 - 不同之处在于 - 在大多数情况下 - 不是技术性的,而是基于意图。 你的例子有点微小,因此很难正确地猜出这个意图。

修改

在详细级别:ScreenSubScreen不共享任何代码。如果您开始向两个实现和公共接口AddComponents添加方法,您可能会找到

  • 您必须在ScreenSubScreen(或委托给Screen)和
  • 中复制代码
  • 您必须向AddComponents添加方法,使这个界面名称错误。

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

在您当前的代码中有一个奇怪的事情:为什么还有一个方法addButton被定义了?只需在相应的构造函数中添加按钮,因为用户在任何情况下都必须调用addButtons,并且该方法没有参数。

另一个未解释的问题是:SubScreen引用了Screen未使用的内容。为什么?所有涉及的课程ScreenSubScreenAddComponents中是否会有更多方法?每个方法是SubScreen委托给Screen还是只有一半?

你知道 - 我们不知道有很多可能性,并且没有在示例代码中显示但是非常重要。我确信你的头脑里有很多细节说“这个提议的东西不会起作用,因为我想在不久的将来以这种方式做到这一点。”遗憾的是,如果没有更多的写作,我们无法将您的内容带入这个网站。 : - )