調停者模式

調停者模式定義:

用一箇中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。將網狀調用關係變成星調用關係。將多對多的關係化解成一對多的關係。



類圖:

源代碼:

/**
 * 職員接口
 */
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。
使用調停者模式貌似要比原本的結構消耗時間,但是卻將需求的發起者與執行者之間的強耦合進行了解耦,極大的優化了系統內部的維護工作。
調停者模式降低的是系統內部的耦合性,而外觀模式降低的是系統之間的耦合性。
調停者模式更加細化,針對的是系統內部類與類之間的強耦合的解除,外觀模式則較爲統籌,針對的是整個系統對外的耦合性解除,二者都都有屏蔽複雜性的作用。

歡迎關注我的微信公衆號:


發佈了70 篇原創文章 · 獲贊 28 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章