我有两个对象。会议对象和Action对象(在会议中引发的操作)。行动也可以独立于会议而存在。我有两种方法将提出的行动与会议联系起来:
对于良好的OO设计,应该使用哪种方法?还是有第三种方式......
答案 0 :(得分:5)
如果只考虑您计划链接到Meeting
个实例的行为,那么让Meeting
了解Action
而不是其他Actions
似乎是最合适的。四处走走。
让Meeting
类操作addAction(Action a)
的内部中断会破坏封装,并且通常会使维护此类代码变得更加困难。因此,在这种情况下,我会在Meeting
上公开方法Meeting
。
但是,如果还有其他可以链接到会议的内容,您可能需要考虑抽象“会议项目”的概念。
您可以定义Action
这样的接口,而不是让IMeetingItem
了解Meeting
,而不是Action
,这些接口会公开IMeetingItem
需要链接的必要信息这些物品。然后meeting.addItem( action ); // action treated as an IMeetingItem in this context
会实施Meeting
,从而可以执行以下操作:
{{1}}
请注意,在这两种方法中,{{1}}类调解向自身添加项目的功能,而不是让添加的项目操纵会议的内部表示。
答案 1 :(得分:1)
我建议您使用方法getID()创建一个“Identifiable”接口,该接口由Action实现
然后您可以执行以下操作:
addToMeeting(Identifiable action);
并在方法内部执行
this.actionId = action.getID();
答案 2 :(得分:0)
只要会议以任何方式与行动相关联,您就会有一些耦合。但是,您可以考虑采用第三种方法来构建生成操作对象的“动作工厂”。一旦创建(并且可能保存),ID就是Action对象上的属性。所有会议都会告诉工厂生成一个动作,并能够访问动作的ID属性。
答案 3 :(得分:0)
我会选择#1 - 在你的情况下,耦合并不是坏事,因为对象之间存在明确的关系。我会选择#1。这使您可以选择会议具有MeetingActions[]
或类似的属性。