OOP:如何处理具有相互关系的对象?

OOP:如何处理具有相互关系的对象?,oop,design-patterns,Oop,Design Patterns,假设有两个类通过某种关系相互关联。例如,一个学生维护一个他参加的课程的列表,每个课程都有一个参加的学生的列表。然后,我害怕让学生直接修改其类的集合,因为每次修改之后都必须对类的学生列表进行类似的修改,反之亦然 一种解决方案是让一个类的唯一目的是跟踪类-学生关系,比如注册员。但是,如果学生中的某个方法需要了解其类列表,则需要将学生传递给注册者。这似乎很糟糕。似乎学生不应该访问注册者,也可以访问其他学生。我可以想出一个解决方案,创建一个类,充当学生和注册者之间的调解人,只向学生显示它需要知道的内容,

假设有两个类通过某种关系相互关联。例如,一个
学生
维护一个他参加的
课程的列表,每个
课程
都有一个参加的
学生的列表。然后,我害怕让
学生
直接修改其
的集合,因为每次修改之后都必须对
学生
列表进行类似的修改,反之亦然

一种解决方案是让一个类的唯一目的是跟踪
-
学生
关系,比如
注册员
。但是,如果
学生
中的某个方法需要了解其
列表,则需要将
学生
传递给
注册者
。这似乎很糟糕。似乎
学生
不应该访问
注册者
,也可以访问其他
学生。我可以想出一个解决方案,创建一个类,充当
学生
注册者
之间的调解人,只向
学生
显示它需要知道的内容,但这似乎有点过分了。另一个解决方案是从
Student
中删除任何需要访问其类的方法,并将其放在
register
或其他可以访问
register
的类中

我问这个问题的原因是我正在用Java做一个国际象棋游戏。我在考虑片细胞关系和片玩家关系。如果在上述示例中,
学生
无法访问
注册员
,那么
工件
可以访问
,因为
工件
无论如何都需要环顾四周以确定移动是否有效


在这种情况下,标准做法是什么?

如果关系可以改变,那么类应该尽可能地解耦,因此在创建每个类的同时,不要在类之间引入绑定关系。 使用封装类间通信逻辑的中间服务/助手可以实现高度分离,因此在这种情况下,您不应该将一个类注入另一个类,即使这两个类都是通过接口抽象的,基本上
学生
一无所知,而
班级
学生
一无所知。我不确定这样的复杂性在你的情况下是否有意义,但无论如何你可以做到

下面是一个有用的工具,可以封装两个解耦实体之间的交互逻辑

有了中介模式,对象之间的通信变得更加简单 用中介对象封装。对象不再通信 直接与对方沟通,而是通过 调解人。这减少了通信对象之间的依赖关系, 从而降低联轴器


我认为您在非常好的示例和解释中发现,OO并不能很好地解决所有问题。只要责任明确明确,一切都很好。而且只要每个职责正好放在一个桶(类)中,设计就相当容易。但这里有一个权衡:

  • 如果我为每个职责定义一个单独的类,我将得到一个非常难以理解(有时难以维护)的臃肿设计
  • 如果我为每个单独的职责包括至少一个接口,我将得到比我需要的更多的类和接口
  • 如果我决定这两个类中的一个也负责这个关系,那么这一个对象对另一个对象的了解要比平常多
  • 如果在每种情况下都引入一个中介或类似的东西,那么您的设计将比问题更复杂
因此,也许你应该问以下问题:

  • 两个对象之间的关系发生变化的可能性有多大
  • 每端多个1类对象之间存在关系的可能性有多大
  • 系统的这一部分是否是高度可见的部分,因此许多其他部分将与之交互(因此将依赖于它)
采取可能有效的最简单解决方案,并从这一点开始。只要解决方案保持简单,它只是您的代码(您不为其他人设计库),您就有可能在以后更改设计而不费吹灰之力

所以在你的具体案例中

  • board字段应该可以访问整个board XOR
  • 字段上的数字应负责移动XOR
  • 应该有一个对象类型(棋类游戏?)负责移动、阻挡、攻击的整体知识
  • 我确实认为所有这些都是有效的,这取决于你的特殊“商业案例”,哪一个是最有效的