中介者模式
文章目录
中介者模式的定义是:用一个中介对象封装一系列的对象交互,中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变它 们之间的交互。
中介者模式适合于组件之间过于耦合而不方便修改的情况。因为中介者模式强制组件之间只通过中介者交互,而不是组件之间直接交互,避免组件之间相互依赖紧密耦合,方便于修改。类所拥有的依赖关系越少, 就越易于修改、 扩展或复用。
因为交互都是通过中介者来实现,所以需要在中介者中定义交互的所有方法。
classDiagram
class ComponentA{
-m:Mediator
+ operationA()
}
class ComponentB{
-m:Mediator
+ operationB()
}
class Mediator{
<<interface>>
+ notify()
}
class ConcrateMediator{
- ComponentA
- ComponentB
+ notify()
+ operationA()
+ operationB()
}
ComponentA --> Mediator
ConcrateMediator ..|> Mediator
ComponentB --> Mediator
ConcrateMediator *--> ComponentA
ConcrateMediator *--> ComponentB
代码实现:
// 抽象组件
public abstract class Plane {
protected Mediator mediator;
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
abstract void notifyMsg(String msg);
abstract void receiveMsg(String msg);
}
public class PlaneA extends Plane {
@Override
public void notifyMsg(String msg) {
System.out.println("PlaneA 通知控制塔:" + msg);
mediator.notifyOtherPlane(this, msg);
}
@Override
public void receiveMsg(String msg) {
System.out.println("PlaneA 收到控制塔通知:" + msg);
}
}
public class PlaneB extends Plane {
@Override
public void notifyMsg(String msg) {
System.out.println("PlaneB 通知控制塔:"+msg);
mediator.notifyOtherPlane(this,msg);
}
@Override
public void receiveMsg(String msg) {
System.out.println("PlaneB 收到控制塔通知:"+msg);
}
}
// 抽象中介者
public interface Mediator {
void notifyOtherPlane(Plane plane, String msg);
}
public class ControllerTower implements Mediator{
Plane planeA;
Plane planeB;
public void setPlaneA(Plane planeA) {
this.planeA = planeA;
}
public void setPlaneB(Plane planeB) {
this.planeB = planeB;
}
@Override
public void notifyOtherPlane(Plane plane, String msg) {
if(plane==planeA){
planeB.receiveMsg("PlanA 需要"+msg);
}else if(plane==planeB){
planeA.receiveMsg("PlanB 需要"+msg);
}
}
}
Plane planeA=new PlaneA();
Plane planeB=new PlaneB();
ControllerTower tower=new ControllerTower();
tower.setPlaneA(planeA);
tower.setPlaneB(planeB);
planeA.setMediator(tower);
planeB.setMediator(tower);
planeA.notifyMsg("起飞");
中介者模式的优点是减低组件间的耦合度,方便修改组件。
缺点是由于中介者需要定义组件间交互的所有方法,容易变成上帝对象。
文章作者 梧桐碎梦
上次更新 2023-05-21 14:54:15