两个对象如何通信(内部示例)

时间:2011-07-31 07:40:45

标签: oop class inheritance object

如果两个孩子拥有相同的父母,那么第二个孩子如何处理从一个孩子开始的事件。

所以示例是:

TrackerContainer是Tracker和TrackerPanel的父级。 TrackerPanel是PlayButton的父级。 Tracker是一个类似计时器的类,并且有一个stop()方法。 PlayButton有一个activate()和deactivate()方法。

如何从Tracker中调用stop()方法从PlayButton()中调用deactivate()方法。我想有时间跟踪TrackerContainer类中发生的事情,但这感觉不对。

编辑这里是代码(顺便说一下,JavaScript):

function TrackerContainer
{
   this.display = new Tracker();
   this.panel = new TrackerPanel();
}

function Tracker
{
   this.play = function() { /* yada */ }
   this.stop = function() { /* yada */ }
}

function TrackerPanel
{
   this.playButton = new PlayButton();
}

function PlayButton
{
   this.activate = function() { /* method called when Tracker is playing */ }
   this.deactivate = function() { /* method called when Tracker is stopped */ }
}

2 个答案:

答案 0 :(得分:1)

最简单的解决方案是将Tracker传递给PlayButton的一个实例。 stop()中的跟踪器会调用playbutton.deactivate()。如果它让你感觉更有用,那么你可以让PlayButton实现一个Deactivatible接口,跟踪器可以使用它。

答案 1 :(得分:1)

您没有说明语言,因此我们将以一般性的方式进行讨论。这是模型 - 视图 - 控制器模式。您的PlayButton是一个视图。你的Tracker是模型,TrackerContainer是控制器(我猜是;它可能是一个视图,在这种情况下你应该有一个单独的控制器对象)。

视图的工作是显示事物。该模型的工作是跟踪数据。控制器在两者之​​间进行协调。

对于此问题,您可能需要Observer模式。控制器观察模型并根据需要更新视图。实现Observer模式的一种方法是使用委托或侦听器。您可以使用TrackerListenerTrackerContainer等方法创建trackerDidStart()符合trackerDidStop()的接口。 Tracker HAS-A TrackerListener并在状态发生变化时调用侦听器方法。 TrackerContainer然后更新按钮的状态。