java - 具有附加功能的装饰器模式

标签 java design-patterns uml decorator software-design

我在教科书中找到了装饰器模式的这个例子。

Decorator pattern example

如果我们考虑对象:

LockedStack MyStack = new LockedStack(new UndoStack(new Stack()))

如何在其上调用函数 undo?

MyStack.delegate.undo() 将无法工作,因为 delegate 是私有(private)的。

这个例子在这种情况下不起作用还是我遗漏了什么?

最佳答案

装饰器模式的目的是:

to add new reponsibilities to objects dynamically.

如果新职责是关于现有操作(例如 push()pop()),装饰器将负责将调用转发给装饰对象在履行额外职责之前/之后。

如果新职责是关于附加操作的,装饰器模式不提供任何方式来累积沿线所有中间装饰器的新操作。这不会使设计出错(事实上GoF提供了这样的例子)。装饰器也不提供对装饰对象的访问,因为这会导致客户端代码违反最少知识原则(得墨忒耳法则),这会产生隐藏的耦合。

解决方案是以另一种方式使用你的装饰器链:如果你有一个提供 LockStack 操作的 LockStack 和一个提供撤消操作的 UndoStack,你需要跟踪每个装饰器对象,并使用正确的对象来得到相应的操作。这比创建委托(delegate) getter 并在某些代码中假设锁栈总是委托(delegate)给 undostack(隐藏耦合)要健壮得多。

关于java - 具有附加功能的装饰器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75065105/

相关文章:

java - 警报对话框无法添加窗口错误

design-patterns - 抽象工厂模式讲解

使用 1 个菜单和许多 UIPopoverController 的基本应用程序的 iOS 设计模式......?

uml - 在 WhiteStarUML 中如何将来自框架的刺激添加到对象的生命线?

uml - BoUML 中 UML 的 ReadVariableAction 的语义是什么?

c++ - UML图中的 protected 方法?

java - ImageIO 无法解析为类型

为 ubuntu 使用 oracle 自解压安装程序时 Java 不可见

java - 未关闭的流是否会导致 java 中的内存泄漏?

java - 策略模式的鸭子示例