Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是装饰图案的变体还是一种图案?_Java_Design Patterns - Fatal编程技术网

Java 这是装饰图案的变体还是一种图案?

Java 这是装饰图案的变体还是一种图案?,java,design-patterns,Java,Design Patterns,下面是我为重写类方法(使用组合)而编写的代码的简化版本,在本例中,我重写的方法名是addbuttons();类“Screen”向屏幕添加按钮,而类“SubScreen”向屏幕实例添加自定义按钮。也许这不是装饰模式的一个例子,因为我覆盖了功能而不是扩展它?有没有更好的方法(使用设计模式)来实现相同的功能 public class Driver { public static void main(String args[]){ AddComponents add1 = ne

下面是我为重写类方法(使用组合)而编写的代码的简化版本,在本例中,我重写的方法名是addbuttons();类“Screen”向屏幕添加按钮,而类“SubScreen”向屏幕实例添加自定义按钮。也许这不是装饰模式的一个例子,因为我覆盖了功能而不是扩展它?有没有更好的方法(使用设计模式)来实现相同的功能

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
    }

}

另一种可能是称之为代理。Decorator和Proxy在技术上非常相似——区别在于——在大多数情况下——不是技术上的,而是基于意图。 您的示例有点小,因此很难正确猜测意图

编辑

在详细级别:
屏幕
子屏幕
不共享任何代码。如果开始向实现和公共接口添加方法,您可能会发现

  • 您必须在
    屏幕
    子屏幕
    (或委托给
    屏幕
    )中复制代码,并且
  • 您必须将方法添加到
    AddComponents
    ,这些方法会使此接口命名错误
如果两个屏幕类在抽象逻辑级别和实现级别上都相似,那么一个带有两个派生类的类
AbstractScreen
会更好。要恢复模式发言:使用
AbstractScreen
中的工厂方法专门化不同按钮的行为

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

另一个未解释的点是:
子屏幕
引用了未使用的
屏幕
。为什么?在所有涉及的类
屏幕
子屏幕
添加组件
中是否会有更多的方法?每个方法是在
子屏幕
中委托给
屏幕
还是仅一半


你看,有很多我们不知道的可能性,在示例代码中没有显示,但是非常重要。我敢肯定你的脑袋里有很多细节,上面写着“这个提议的东西行不通,因为我想在不久的将来这样那样做。”遗憾的是,如果没有更多的文字,我们无法将你脑袋里的内容放到这个网站上。:-)

另一种可能是称之为代理。Decorator和Proxy在技术上非常相似——区别在于——在大多数情况下——不是技术上的,而是基于意图。 您的示例有点小,因此很难正确猜测意图

编辑

在详细级别:
屏幕
子屏幕
不共享任何代码。如果开始向实现和公共接口添加方法,您可能会发现

  • 您必须在
    屏幕
    子屏幕
    (或委托给
    屏幕
    )中复制代码,并且
  • 您必须将方法添加到
    AddComponents
    ,这些方法会使此接口命名错误
如果两个屏幕类在抽象逻辑级别和实现级别上都相似,那么一个带有两个派生类的类
AbstractScreen
会更好。要恢复模式发言:使用
AbstractScreen
中的工厂方法专门化不同按钮的行为

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

另一个未解释的点是:
子屏幕
引用了未使用的
屏幕
。为什么?在所有涉及的类
屏幕
子屏幕
添加组件
中是否会有更多的方法?每个方法是在
子屏幕
中委托给
屏幕
还是仅一半


你看,有很多我们不知道的可能性,在示例代码中没有显示,但是非常重要。我敢肯定你的脑袋里有很多细节,上面写着“这个提议的东西行不通,因为我想在不久的将来这样那样做。”遗憾的是,如果没有更多的文字,我们无法将你脑袋里的内容放到这个网站上。:-)

谢谢,我刚读过,现在看来我是代理了。我的意图是根据用户选择的菜单项向同一GUI屏幕添加不同的按钮,这是否足够?您描述了从外部看到的代码意图——“此代码将实现什么?”意图。但是像Decorator这样的设计模式在这个层次上并不存在。我的目标是“代码如何实现这个目标?”的意图。在这个层面上,提到的设计模式很重要。我在问题中发布的代码中是否没有描述其意图?你们能给我一个例子说明你们所说的“意图”是什么意思吗?仅供参考:我编辑了两次,试图解释我的意图是什么。标准书[设计模式][是一本标准书,因为它不仅从技术层面上描述了模式,还从各种半技术的角度详细解释了每个模式。谢谢,我刚刚读过,现在在我看来似乎是代理。我的意图是根据用户选择的菜单项向同一GUI屏幕添加不同的按钮,这就足够了吗?你知道吗从外部描述代码的意图——“此代码将实现什么?”意图