調停者模式定義:
用一箇中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。將網狀調用關係變成星調用關係。將多對多的關係化解成一對多的關係。
類圖:
源代碼:
/**
* 職員接口
*/
abstract class Employee {
String name;
private Mediator mediator;
public Employee(Mediator mediator,String name){
this.mediator = mediator;
this.name = name;
}
//被調停者調用的方法
public void called(String message,String fromName){
System.out.println(this.name + "接收到來自"+ fromName + "的需求:" + message);
}
//調用調停者
public void call(String message,String toName){
System.out.println(this.name + "發起需求:"+ message);
mediator.send(message,this.name,toName);
}
}
interface Mediator {
void addEmployee(String name, Employee employee);
void send(String message,String fromName,String toName);
}
/**
* 調停者:經理
*/
class Manager implements Mediator {
private Map<String,Employee> employeeMap = new HashMap<String, Employee>();
@Override
public void addEmployee(String name, Employee employee) {
employeeMap.put(name, employee);
}
@Override
public void send(String message,String fromName,String toName) {
System.out.println("經理收到" + fromName + "的需求:" + message);
System.out.println("經理將" + fromName + "的需求發送給目標職員");
employeeMap.get(toName).called(message,fromName);
}
}
/**
* 職員A
*/
class EmployeeA extends Employee {
public EmployeeA(Mediator mediator, String name) {
super(mediator, name);
}
}
/**
* 職員B
*/
class EmployeeB extends Employee {
public EmployeeB(Mediator mediator, String name) {
super(mediator, name);
}
}
/**
* 職員C
*/
class EmployeeC extends Employee {
public EmployeeC(Mediator mediator, String name) {
super(mediator, name);
}
}
class Client {
public static void main(String[] args) {
//分配職員與經理
Mediator manager = new Manager();
Employee employeeA = new EmployeeA(manager,"職員A");
Employee employeeB = new EmployeeB(manager,"職員B");
Employee employeeC = new EmployeeC(manager,"職員C");
manager.addEmployee(employeeA.name,employeeA);
manager.addEmployee(employeeB.name,employeeB);
manager.addEmployee(employeeC.name,employeeC);
//職員A的需求
String messageA = "這些資料需要B職員操作";
employeeA.call(messageA,employeeB.name);
System.out.println();
//職員C的請求
String messageC = "這些資料需要B職員簽名";
employeeC.call(messageC,employeeB.name);
}
}
控制檯輸出:
職員A發起需求:這些資料需要B職員操作
經理收到職員A的需求:這些資料需要B職員操作
經理將職員A的需求發送給目標職員
職員B接收到來自職員A的需求:這些資料需要B職員操作
職員C發起需求:這些資料需要B職員簽名
經理收到職員C的需求:這些資料需要B職員簽名
經理將職員C的需求發送給目標職員
職員B接收到來自職員C的需求:這些資料需要B職員簽名
總結:
如上所列,職工A和職工C都需要請求職工B,但是假如他們不認識職工B,那麼就將工作需求提交給經理,經理再將工作需求發送給職工B。
使用調停者模式貌似要比原本的結構消耗時間,但是卻將需求的發起者與執行者之間的強耦合進行了解耦,極大的優化了系統內部的維護工作。
調停者模式降低的是系統內部的耦合性,而外觀模式降低的是系統之間的耦合性。
調停者模式更加細化,針對的是系統內部類與類之間的強耦合的解除,外觀模式則較爲統籌,針對的是整個系統對外的耦合性解除,二者都都有屏蔽複雜性的作用。
歡迎關注我的微信公衆號: