在过去的几周中,我一直在思考一种使不相关的对象相互通信的方法。尽管我已经找到了使其工作的几种方法,但它们似乎都显得有些古怪或过于复杂。
一种可行的解决方案是创建某种充当“调解员”角色的超类,检查其成员对象的状态并做出相应的响应。
struct SuperClass {
Car playerCar;
Police police;
void update() { if(playerCar.exceedsSpeed()) { police.call(); } }
};
尽管这在简单的程序中可以很好地工作,但这种设计往往会使复杂性变得混乱。随着创建更多不同的对象类型,需要更多的超类或中级超类。最终,您得到了一个严格的类层次结构,这很难维护。
另一种解决方案是将对象的引用作为参数传递。
struct Car {
Police* pPolice;
Car(Police* obj) { pPolice = obj; }
};
Police police;
Car playerCar(&police);
每个对Police::call()
的调用都可以通过pPolice
进行,但是此解决方案有两个问题。
首先,Car
结构现在没有任何意义。如果每辆汽车都有color
,manufacturer
,maxSpeed
等各种特征,那么为什么每辆汽车都有police
?由于对象是包含特定于该对象类型的变量的结构,因此在这些变量中包含完全不相关的变量会破坏OOP的美观性。
第二,如果Car
需要调用的对象的方法不仅仅是police.call()
,我现在需要传递更多的引用作为参数。
Car playerCar(&police, &anotherObj, &yetAnotherObj...)
...这真是愚蠢。
相反,我希望能够在本地调用适当的方法。
void Car::accelerate() {
speed++;
if (speed > maxSpeed) { Mediator::callPolice(); }
};
我该怎么做?那可能吗?那是正确的方法吗?
答案 0 :(得分:2)
好像您通常有两种情况。
一个是警察抓到超速驾驶的人。他们不会叫警察报告自己-而是一个警官可以在某个区域内观察,并且在经过该区域时如果汽车超过了限制(并且该警员没有被其他人占用) ,他被抓到并获得了罚单(或其他证明)。
第二,是汽车的驾驶员决定报警(例如发生事故)。在这种情况下,有一个类似于“调解员”的类。具体来说,有一个代表电话系统的类,驾驶员(或其他看见的驾驶员)使用他们的电话报警。如果没有人拿着电话看到事件,那么警察可能不会接到电话-或至少在驾驶员找到有人拿着电话时会有所延迟。
答案 1 :(得分:0)
在“警察”结构内创建一个公共静态方法“ callPolice”。然后,您可以从Car结构体中的方法调用它。如果“ callPolice”方法的主体不需要在特定的Police对象的实例上执行,这将对您有用。