两类之间的1-n关系是否可以接受?

时间:2009-09-08 18:49:55

标签: oop

我遇到了这样的问题。

A类有一个B类列表.A选择B中的一个,然后调用它的方法。所以A取决于B。

但是当一个计时器(不是一个真正的计时器,只是一个模拟时钟)触发时,B必须告诉A“我完成了”,所以A可以选择另一个B来工作,这意味着B也必须知道A.

这是一种“双向1-n关系”,我认为A和B并没有很好地分开。

当然我可以使用Observer Pattern并使A成为观察者而B成为主题,但这并不是观察者模式有意义的典型情况,因为只有一个观察者。

你怎么看待它?

3 个答案:

答案 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它只知道它自己的事件。