【问题标题】:How to build stuff objects using the decorator pattern?如何使用装饰器模式构建东西对象?
【发布时间】:2021-03-28 12:35:44
【问题描述】:

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

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

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

那么我如何在不破坏 ISP 的情况下解决这个问题,同时又不需要创建大量更改最少的类,例如“带枪的人”、“带枪和防弹衣的人”、“带工作人员和身体的人”盔甲”,“有杖的人”,你懂的。

【问题讨论】:

    标签: design-patterns decorator design-principles interface-segregation-principle decorator-pattern


    【解决方案1】:

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

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

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

    【讨论】:

    • AOP 通常用于添加横切关注点。装饰器是另一回事。
    • 是的,AOP 也可以使用,尽管它可能会使 DI 更复杂一些。就我个人而言,我更喜欢使用装饰器来处理这些事情。你会用它们做什么?请详细说明。
    • 在Java中,quintessential example是IO包中的各种Readers和Writers。
    • 好吧,我用这个来告诉你:blog.ploeh.dk/2010/04/07/DependencyInjectionisLooseCoupling Mark Seemann 总是一个很好的来源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多