gpt4 book ai didi

design-patterns - 装饰器模式——将装饰器限制在特定类型的组件上

转载 作者:行者123 更新时间:2023-12-01 13:41:46 25 4
gpt4 key购买 nike

当你的装饰器被应用到不兼容的组件时,你会怎么做?

如果您考虑给出的经典示例来说明模式的使用,即图形窗口,如果您将滚动条装饰器应用于对话框(“对话框”是具有固定大小的具体窗口组件),会发生什么情况?或者更确切地说,“应该”发生什么? (我认为理想情况下应该“什么都不做”,至少就滚动条装饰对话框的用户在他们的屏幕上看到的内容而言,但我对避免人们做傻事的策略更感兴趣。)

最佳答案

but I'm more interested in strategies to avoid people doing stupid things

您可以使用 marker 来实现此目的接口(interface)模式。

  • 定义一个名为Scrollable 的接口(interface)。
  • 所有支持滚动功能的组件都将实现这个接口(interface)。例如,WindowScrollable,因此应该实现此接口(interface)。
  • 具体的 ScrollDecorator 实现将具有 Scrollable 实例变量和一个采用 Scrollable 参数的构造函数。
  • 通过使 ScrollDecorator 构造函数采用 Scrollable 参数,您现在可以限制 ScroallDecorator 只能装饰那些可滚动的实例可滚动

由于这是一个与语言无关的问题,“接口(interface)”和“实现”这两个词不应与 Java 编程语言相关联,而应与一般定义相关联。也就是说,这是上面在 Java 中讨论的要点的编码版本:

让我们首先看一下解决方案的最终期望状态:

 Component window =  new ScrollDecorator(new Window());//should be allowed
Component dialog = new ScrollDecorator(new Dialog());//should not be allowed.

尝试用滚动条装饰对话框将导致编译错误。现在让我们看看使这成为可能的类:

组件

public interface Component {
public void load();
}

可滚动(标记界面)

public interface Scrollable extends Component {

}

混凝土构件(窗)

public class Window implements Scrollable {

@Override
public void load() {
//code for drawing a window.
}

}

具体组件(对话框)

class Dialog implements Component {

@Override
public void load() {
//code for drawing a dialog.
}

}

滚动装饰器

public class ScrollDecorator implements Component {

private Scrollable scrollable;

public ScrollDecorator(Scrollable scrollable) {
this.scrollable = scrollable;
}

@Override
public void load() {
scrollable.load();
//code for drawing a scrollbar over the scrollable component

}
}

可用于实现此目的的其他特定于语言的选项是 Java 中的注释或 .NET 中的自定义属性。

关于design-patterns - 装饰器模式——将装饰器限制在特定类型的组件上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39534562/

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