装饰者模式是否违反了 SOLID 原则?
Does the decorator pattern violate SOLID principles?
假设我们有一个这样的组件 class:
class Component:
def operation(self) -> str:
return f"Performing operation"
def another_operation(self) -> str:
return f"Performing another operation"
然后我们有一个重载其两个方法的子组件:
class ChildComponent(Component):
def operation(self) -> str:
return f"Performing operation differently"
def another_operation(self) -> str:
return f"Performing another operation differently"
然后我们可以定义一个装饰器来修改操作的行为:
class Decorator(Component):
_component: Component = None
def __init__(self, component: Component) -> None:
self._component = component
def operation(self) -> str:
return f"Decorated...({self._component.operation()})"
def another_operation(self) -> str:
return self._component.another_operation()
根据我的理解,即使我们没有在装饰器中修改 another_operation()
的行为,我们仍然必须定义它而不是依赖 superclass 方法,否则组件的 another_operation()
将被调用而不是 ChildComponent 的方法,并且您手上的混合情况很糟糕。
但是,如果我们这样做,那么任何时候组件 class 获得一个新方法,我们也必须将它添加到装饰器中,这不符合接口隔离原则。因此,我们要么必须违反 SOLID 原则并维护两倍于我们需要的代码量,要么冒着对那些我们没有在装饰器中明确覆盖的方法使用错误方法的风险。
有人可以澄清一下吗?
我将这个问题标记为已解决,因为我在上面的原始问题上发表了关于向 class 添加方法这一事实无论如何都违反了 SOLID 原则的评论。
假设我们有一个这样的组件 class:
class Component:
def operation(self) -> str:
return f"Performing operation"
def another_operation(self) -> str:
return f"Performing another operation"
然后我们有一个重载其两个方法的子组件:
class ChildComponent(Component):
def operation(self) -> str:
return f"Performing operation differently"
def another_operation(self) -> str:
return f"Performing another operation differently"
然后我们可以定义一个装饰器来修改操作的行为:
class Decorator(Component):
_component: Component = None
def __init__(self, component: Component) -> None:
self._component = component
def operation(self) -> str:
return f"Decorated...({self._component.operation()})"
def another_operation(self) -> str:
return self._component.another_operation()
根据我的理解,即使我们没有在装饰器中修改 another_operation()
的行为,我们仍然必须定义它而不是依赖 superclass 方法,否则组件的 another_operation()
将被调用而不是 ChildComponent 的方法,并且您手上的混合情况很糟糕。
但是,如果我们这样做,那么任何时候组件 class 获得一个新方法,我们也必须将它添加到装饰器中,这不符合接口隔离原则。因此,我们要么必须违反 SOLID 原则并维护两倍于我们需要的代码量,要么冒着对那些我们没有在装饰器中明确覆盖的方法使用错误方法的风险。
有人可以澄清一下吗?
我将这个问题标记为已解决,因为我在上面的原始问题上发表了关于向 class 添加方法这一事实无论如何都违反了 SOLID 原则的评论。