我对装饰器模式有一些疑问。据我了解,装饰器模式的存在是为了向对象添加行为,即“装饰对象”,因此您可以组合不同的对象,而无需实现大量不同的类,只需进行微小的更改,从而导致“类爆炸” ”。
现在的问题是,一般化的装饰器模式说我们应该有一个基类,然后我们的装饰器类扩展它,但也可以从中进行委托。所以装饰器本质上“是一个”和“有一个”基类(以及它的方法)。
问题就来了,因为让我们说我想为一个游戏组成一个“玩家”,实际上有很多不同的玩家,而且都有微小的变化。然后我可能想使用装饰器模式(?)并说“好吧,我们的基类是普通人”。我想用枪和防弹衣装饰这个人。然后我的装饰器类 gun 将实现与人类相同的方法,让我们说“吃”。但是我的枪肯定不会吃,我只希望它能够射击。我可以通过返回 null 或其他东西来解决这个问题,但这也会破坏接口隔离原则。
那么我如何在不破坏 ISP 的情况下解决这个问题,同时又不需要创建大量更改最小的类,例如“带枪的人”、“带枪和防弹衣的人”、“带工作人员和防弹衣的人”, “人与员工”,你明白了。