作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这更像是一个设计问题......如果出现以下情况,则不能使用装饰设计模式:
1) 该对象被标记为“密封”,这意味着您不能从中扩展。2) 或者您想覆盖一个方法但它不是虚拟的。
那你能做什么?如果您没有源代码(例如第 3 方库),则无法更改类源代码。
最佳答案
装饰器模式不需要继承。最简单的情况是,如果您要装饰的对象实现了一个接口(interface)。然后你的装饰器可以简单地实现相同的接口(interface):
[ IWindow ]
[ + Draw() ]
---------------
|
+--- [ Window ]
| [ + Draw() ]
|
|
+--- [ DecoratedWindow ]
[ + Draw() ]
-------------------
|
+--- [ BorderDecorator ]
|
+--- [ VerticalScrollbarDecorator ]
|
+--- [ HorizontalScrollbarDecorator ]
现在你可以这样做:
IWindow w = new BorderDecorator(
new HorizontalScrollBarDecorator(
new VerticalScrollBarDecorator(
new Window(80, 24))));
// This is a window with a border and scrollbars, even though
// the original Window class has no idea what those are.
w.Draw();
可能的细节取决于您要装饰的类的确切性质。
关于c# - 如果你不能继承你想要装饰的类,你如何实现装饰者模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2794453/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!