我遇到了这样的问题。
A类有一个B类列表.A选择B中的一个,然后调用它的方法。所以A取决于B。
但是当一个计时器(不是一个真正的计时器,只是一个模拟时钟)触发时,B必须告诉A“我完成了”,所以A可以选择另一个B来工作,这意味着B也必须知道A.
这是一种“双向1-n关系”,我认为A和B并没有很好地分开。
当然我可以使用Observer Pattern并使A成为观察者而B成为主题,但这并不是观察者模式有意义的典型情况,因为只有一个观察者。
你怎么看待它?
答案 0 :(得分:2)
我同意n8wrl事件可能是一个更清洁的解决方案。
原始答案:
B是否需要知道所有可能的A或者只是调用它的那个(它告诉我“我已经完成”)?如果是这样,则A可以具有所有B的列表,并且B可以仅引用重要的A。
我是这样做的。是的,这是一个循环关联,但它有一些控制如何使用它。如果需要,最终可以将其重构为更纯粹的观察者模式。
class A
{
List<B> bObj = new List<B>();
public void callB(/*Params*/)
{
B bThatMatters = //Find Appropriate B ...
bThatMatters.DoStuff(this);
}
public void isDone()
{
//Handle being done with the last B
}
}
class B
{
A _callerA;
public void DoStuff(A callerA)
{
_callerA = callerA;
//... DO STUFF
}
public void WhenDone()
{
_callerA.isDone()
}
}
答案 1 :(得分:2)
A知道可用的Bs。 B只知道目前正在使用他的A.我不认为这是1-n吗?
但是B并不依赖于A,他并不关心它是A.他只需要使用他的临时伙伴的“完成()”方法。那里没有真正的依赖。
Class A implements ClientOfB {
Collection<B> myBees;
public beNottified() { ...}
public employeeBee () {
myBees.getRandomBee().buzz(this);
}
}
Class B {
public void buzz(ClientOfB client) {
client.beNotified();
}
}
我没有看到不合理的依赖关系。需要了解buzz并公开界面。 B只知道界面。
答案 2 :(得分:1)
现在只有一位观察员,但将来谁知道呢?
A获得B. B公开A(或其他任何人)订阅的事件。 B发起事件,A得到消息。
B不知道A它只知道它自己的事件。