0

我对装饰器模式有一些疑问。据我了解,装饰器模式的存在是为了向对象添加行为,即“装饰对象”,因此您可以组合不同的对象,而无需实现大量不同的类,只需进行微小的更改,从而导致“类爆炸” ”。

现在的问题是,一般化的装饰器模式说我们应该有一个基类,然后我们的装饰器类扩展它,但也可以从中进行委托。所以装饰器本质上“是一个”和“有一个”基类(以及它的方法)。

问题就来了,因为让我们说我想为一个游戏组成一个“玩家”,实际上有很多不同的玩家,而且都有微小的变化。然后我可能想使用装饰器模式(?)并说“好吧,我们的基类是普通人”。我想用枪和防弹衣装饰这个人。然后我的装饰器类 gun 将实现与人类相同的方法,让我们说“吃”。但是我的枪肯定不会吃,我只希望它能够射击。我可以通过返回 null 或其他东西来解决这个问题,但这也会破坏接口隔离原则。

那么我如何在不破坏 ISP 的情况下解决这个问题,同时又不需要创建大量更改最小的类,例如“带枪的人”、“带枪和防弹衣的人”、“带工作人员和防弹衣的人”, “人与员工”,你明白了。

4

1 回答 1

0

您需要的是“复合”,而不是“装饰器”。装饰器通常用于向对象添加横切关注点,例如日志记录、检测、重试策略等。

在您的情况下,您需要一个通用的 GameObject 类,其中包含一个 Components 集合。组件是向实体添加行为的东西,例如 AI、统计数据、物理等等。

这样你就可以避免创建大量的类,比如“玩家”、“敌人”、“老板”、“MegaBoss”等等。只需定义必要的组件并将它们添加到 GameObject 上即可。

于 2020-12-18T14:06:53.300 回答