我在教科书中找到了装饰器模式的这个例子。
如果我们考虑对象:
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/