说我想实现一个工作场所。有类Employee
的对象,还有一个类WorkArrangement
,就像一个盒子,员工在下周提交他们想要的班次。 (然后管理员清空该框并使用此信息安排下周的轮班)。
问题是,类Employee
中的代码不知道对象box
(类WorkArrangement
),所以我不能写一个说“把你的下周轮班放在一边“。我可以将box
对象作为参数发送到Employee
的构造函数,但在OOP意义上它看起来像是一个糟糕的设计。
那么,这是一个糟糕的设计吗? 如果是,那么可能的解决方案是什么?
答案 0 :(得分:1)
听起来更像是Box
(可能只是一个列表)需要Shift
s,而Employee
有多个Shift
s集合,{{1 }和desiredShifts
。
actualShifts
然后查看每位员工的所需班次,调整周围的一切,并为每位员工分配实际班次,和/或将他们置于共享结构中,以便在公司日历中使用。
答案 1 :(得分:1)
恕我直言,我会使用事件驱动的逻辑(例如using property change listeners)。一旦Employee
实例准备好提交所需的班次,就可以发起一个事件(例如PropertyChangeEvent
)。在此事件对象中,传递班次信息和其他相关信息。从那里,接收者(即WorkArrangement
)可以用这些信息做它喜欢的事情(例如,发出另一个通知Manager
已经收到转移信息的变化事件。)
答案 2 :(得分:1)
直接的方法是让WorkArrangement拥有一个Employee提交请求的方法。 e.g。
public void requestShift(Employee employee, Shift requestedShift);
这样,Employeee不知道WorkArrangement如何或者什么对请求做了什么(他们可能会因为您所知道的而被扔进垃圾箱!)但它知道如何汇总请求。你可能需要一个参数来判断它是哪一周,但我更喜欢已经在WorkArrangement中,例如每周你为那一周构建一个新的WorkArrangement()。稍后,员工可以通过电话找到他们得到的信息:
public Shift getActualShift(Employee employee);
顺便说一下,这引导我们找到一个比“工作安排”更好的名字,这并不意味着很多:像“WeeklySchedule”这样的东西。并非所有的类名都可以简单明了,但是当您设计的第一个类中有一个模糊名称时,这表明您没有走上正确的轨道。
如果你真的不希望WeeklySchedule知道Employee是什么,请注意该参数实际上只是用作标识符,在某些时候你将使用equals()(可能还有hashCode())。所以该参数可以是Object,整数或String employeeID等......