OOP:如何处理具有相互关系的对象?
假设有两个类通过某种关系相互关联。例如,一个OOP:如何处理具有相互关系的对象?,oop,design-patterns,Oop,Design Patterns,假设有两个类通过某种关系相互关联。例如,一个学生维护一个他参加的课程的列表,每个课程都有一个参加的学生的列表。然后,我害怕让学生直接修改其类的集合,因为每次修改之后都必须对类的学生列表进行类似的修改,反之亦然 一种解决方案是让一个类的唯一目的是跟踪类-学生关系,比如注册员。但是,如果学生中的某个方法需要了解其类列表,则需要将学生传递给注册者。这似乎很糟糕。似乎学生不应该访问注册者,也可以访问其他学生。我可以想出一个解决方案,创建一个类,充当学生和注册者之间的调解人,只向学生显示它需要知道的内容,
学生
维护一个他参加的课程的列表,每个课程
都有一个参加的学生的列表。然后,我害怕让学生
直接修改其类
的集合,因为每次修改之后都必须对类
的学生
列表进行类似的修改,反之亦然
一种解决方案是让一个类的唯一目的是跟踪类
-学生
关系,比如注册员
。但是,如果学生
中的某个方法需要了解其类
列表,则需要将学生
传递给注册者
。这似乎很糟糕。似乎学生
不应该访问注册者
,也可以访问其他学生。我可以想出一个解决方案,创建一个类,充当学生
和注册者
之间的调解人,只向学生
显示它需要知道的内容,但这似乎有点过分了。另一个解决方案是从Student
中删除任何需要访问其类的方法,并将其放在register
或其他可以访问register
的类中
我问这个问题的原因是我正在用Java做一个国际象棋游戏。我在考虑片细胞关系和片玩家关系。如果在上述示例中,学生
无法访问注册员
,那么工件
可以访问板
,因为工件
无论如何都需要环顾四周以确定移动是否有效
在这种情况下,标准做法是什么?如果关系可以改变,那么类应该尽可能地解耦,因此在创建每个类的同时,不要在类之间引入绑定关系。
使用封装类间通信逻辑的中间服务/助手可以实现高度分离,因此在这种情况下,您不应该将一个类注入另一个类,即使这两个类都是通过接口抽象的,基本上学生对类一无所知,而班级
对学生
一无所知。我不确定这样的复杂性在你的情况下是否有意义,但无论如何你可以做到
下面是一个有用的工具,可以封装两个解耦实体之间的交互逻辑
有了中介模式,对象之间的通信变得更加简单
用中介对象封装。对象不再通信
直接与对方沟通,而是通过
调解人。这减少了通信对象之间的依赖关系,
从而降低联轴器
我认为您在非常好的示例和解释中发现,OO并不能很好地解决所有问题。只要责任明确明确,一切都很好。而且只要每个职责正好放在一个桶(类)中,设计就相当容易。但这里有一个权衡:
- 如果我为每个职责定义一个单独的类,我将得到一个非常难以理解(有时难以维护)的臃肿设计
- 如果我为每个单独的职责包括至少一个接口,我将得到比我需要的更多的类和接口
- 如果我决定这两个类中的一个也负责这个关系,那么这一个对象对另一个对象的了解要比平常多
- 如果在每种情况下都引入一个中介或类似的东西,那么您的设计将比问题更复杂
因此,也许你应该问以下问题:
- 两个对象之间的关系发生变化的可能性有多大
- 每端多个1类对象之间存在关系的可能性有多大
- 系统的这一部分是否是高度可见的部分,因此许多其他部分将与之交互(因此将依赖于它)
采取可能有效的最简单解决方案,并从这一点开始。只要解决方案保持简单,它只是您的代码(您不为其他人设计库),您就有可能在以后更改设计而不费吹灰之力
所以在你的具体案例中
board字段应该可以访问整个board XOR
字段上的数字应负责移动XOR
应该有一个对象类型(棋类游戏?)负责移动、阻挡、攻击的整体知识
我确实认为所有这些都是有效的,这取决于你的特殊“商业案例”,哪一个是最有效的