调停者模式
定义:一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互。
优点:当使用调停者模式时它将各个通信的对象解耦,使得原本分布在多个对象间的行为集中在一起,改变这些行为只需要生成新的协调类即可。便于维护拓展。
缺点:使控制集中化,因为所有的交互都集中在调停者类中。这个类变得复杂难管理。
小巩需要做一个交通通信系统,支持不同种类的车互相通信。如果不用调停者模式,需要写很多不同种类车的send方法。
下面看看调停者模式的实现,先实现调停者。支持注册汽车和发送消息。消息都要经过调停者才能发送:
public interface Trafficlights {
void send(String carFrom, String carTo, String signal);
void add(Car car);
}
import java.util.Map;
import java.util.HashMap;
public class TrafficlightsImpl implements Trafficlights {
private Map map = new HashMap();
public void send(String carFrom, String carTo, String signal) {
Car carF = (Car)map.get(carFrom);
Car carT = (Car)map.get(carTo);
carT.receiveSignal(carF,signal);
}
public void add(Car car) {
car.setTrafficlights(this);
map.put(car.getName(), car);
}
}
下面实现汽车类
public abstract class Car {
public void sendSignal(String carFrom, String carTo, String signal) {
trafficlights.send(carFrom, carTo, signal);
}
public abstract void receiveSignal (Car carFrom, String signal) ;
public abstract String getName();
public Trafficlights getTrafficlights(){ return trafficlights; }
public void setTrafficlights(Trafficlights trafficlights){ this.trafficlights = trafficlights; }
private Trafficlights trafficlights;
}
public class CarA extends Car {
private String name;
public String getName() {
return "A";
}
public void receiveSignal (Car carFrom, String signal) {
System.out.println(carFrom.getName() + "车向" + getName() + "车发送来了消息,消息的内容是:" + signal);
}
}
public class CarB extends Car {
private String name;
public String getName() {
return "B";
}
public void receiveSignal (Car carFrom, String signal) {
System.out.println(carFrom.getName() + "车向" + getName() + "车发送来了消息,消息的内容是:" + signal);
}
}
客户端的示意代码
public class Client {
public static void main(String[] argv) {
Trafficlights trafficlights = new TrafficlightsImpl();
Car a = new CarA();
Car b = new CarB();
trafficlights.add(a);
trafficlights.add(b);
a.sendSignal("A", "B", "你先通过");
}
}