将被大量子类使用的类解耦

3

你好,我有一个类似这样的情况:

enter image description here

我的设计中有不同的物品,每个物品对角色都有一些特定的影响。每个物品都有一个应用函数,因此它可以使用角色对象并改变其功能。但是如果我更改角色函数,我将不得不相应地更改所有物品类。

如何高效地解耦物品和角色?

我将使用C++语言,但我不知道物品和角色类中的其他变量和函数。我只想解耦它们。


在面向对象的设计中,“角色”会对自身进行更改。将逻辑分离为“项目”,将数据分离为“角色”,这是过程式编程而不是面向对象编程。 - jaco0646
3个回答

0
你可以引入一个接口(在 C++ 中为抽象类),让 Character 继承它。我们称之为 ItemUser。Item#apply 签名将被更改,使其接受一个 ItemUser 对象而不是 Character 对象。现在,只要 Character 遵守 ItemUser 的契约,就可以自由地更改其实现方式了。

0

检查装饰器设计模式,它似乎是你正在寻找的设计模式。链接:装饰器设计模式


0
根据我从阅读您的问题中所理解的,您有多个物品类,每个类都有一个相关联的效果。与物品对象类型对应的效果会应用于另一个实体,即角色。现在您的问题是,每当角色类发生变化时,您的物品类也需要更改,并且您希望有一种更清晰的方法来避免这种情况。
处理变化的好方法是定义明确定义的合同,这样就不太容易发生变化。例如,如果我们有一个功能来添加两个整数,后来我们可能需要更改为添加两个浮点数,然后我们可能需要将添加操作替换为乘法。在这种情况下,您可以定义一个抽象 Compute(INum num1,INum num2):INum 作为返回类型。这里 INum 是类型的抽象,Compute 是函数行为的抽象。实际实现定义了 INum 和 Compute。现在使用我们代码的代码仅依赖于抽象,我们可以自由地修改操作和实际类型,而不影响用户代码。
在实施合同时,您可以修改内部实现,而不会影响使用合同的外部代码。

你可以定义一个抽象类ICharacter。对于那些类型可能会在未来发生变化的属性,你可以使用模板和泛型,或者也可以为属性类型创建接口,并让具体类型实现这些接口。将所有字段都引用接口。让ICharacter定义带有接口类型参数和返回类型的公共抽象方法。

让Item类使用ICharacter,当你需要根据Item类应用效果时,只需使用已定义的常量抽象函数。现在,你的角色内部修改可以更改,而不会影响Item类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接