gpt4 book ai didi

java - 这是装饰器模式的变体还是根本就是一种模式?

转载 作者:行者123 更新时间:2023-12-02 00:36:31 24 4
gpt4 key购买 nike

下面是我编写的用于重写类方法(使用组合)的代码的简化版本,在本例中,我要重写的方法名称是 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 不共享任何代码。如果您开始向这两个实现和公共(public)接口(interface)添加方法AddComponents,您可能会发现

  • 您必须在 ScreenSubScreen 中复制代码(或委托(delegate)给 Screen),并且
  • 您必须向 AddComponents 添加方法,这会使该接口(interface)的命名很糟糕。

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

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

另一点没有解释的是:SubScreen 具有对未使用的 Screen 的引用。为什么?所有涉及的类ScreenSubScreenAddComponents中是否都会有更多的方法?每个方法都是 SubScreen 中委托(delegate)给 Screen 还是只是其中的一半?

你看,有很多可能性我们不知道,也没有在示例代码中显示,但它们非常重要。我确信你的脑子里包含了很多细节,说“这个提议的东西不会起作用,因为我想在不久的将来以这样或那样的方式做这做那”。遗憾的是,如果没有更多的文字,我们无法将您头脑中的内容放入此站点。 :-)

关于java - 这是装饰器模式的变体还是根本就是一种模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7666972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com