天天看點

Java描述設計模式(17):調停者模式一、生活場景二、調停者模式三、調停者模式總結四、源代碼位址

本文源碼: GitHub·點這裡 || GitEE·點這裡

一、生活場景

1、場景描述

在公司的日常安排中,通常劃分多個部門,每個部門又會分為不同的小組,部門經理的一項核心工作就是協調部門小組之間的工作,例如開發小組,産品小組,小組的需求統一彙總到經理,經理統一安排和協調。

2、場景圖解

Java描述設計模式(17):調停者模式一、生活場景二、調停者模式三、調停者模式總結四、源代碼位址

3、代碼實作

public class C01_InScene {
    public static void main(String[] args) {
        Manager manager = new Manager() ;
        EmployeeA employeeA = new EmployeeA("張三",manager) ;
        EmployeeB employeeB = new EmployeeB("李四",manager) ;
        employeeA.sendMsg(employeeA.name,"需要産品文檔",employeeB);
    }
}
/**
 * 部門協調接口
 */
interface Department {
    void coordinate (String userName,String msg,Employee employee) ;
}
/**
 * 部門經理
 */
class Manager implements Department {
    @Override
    public void coordinate (String userName,String msg,Employee employee) {
        System.out.println("經理接收【"+userName+"】的協調任務:" + msg);
        System.out.println("經理轉發【"+userName+"】協調任務,@【"+employee.name+"】");
        employee.getMsg(userName,msg);
    }
}
/**
 * 員工抽象類
 */
abstract class Employee {
    public String name ;
    private Department department ;
    public Employee (String name,Department department){
        this.name = name ;
        this.department = department ;
    }
    public void getMsg (String userName,String msg){
        System.out.println("【"+this.name+"】收到"+"【"+userName+"】協調任務:["+msg+"]");
    }
    public void sendMsg (String name,String msg,Employee employee){
        System.out.println("【"+name+"】發起協調任務:"+ msg);
        department.coordinate(name,msg,employee);
    }
}
/**
 * 具體員工
 */
class EmployeeA extends Employee {
    public EmployeeA(String name, Department department) {
        super(name, department);
    }
}
class EmployeeB extends Employee {
    public EmployeeB(String name, Department department) {
        super(name, department);
    }
}           

執行結果

【張三】發起協調任務:需要産品文檔
經理接收【張三】的協調任務:需要産品文檔
經理轉發【張三】協調任務,@【李四】
【李四】收到【張三】協調任務:[需要産品文檔]           

二、調停者模式

1、基本概念

調停者模式是對象的行為模式。調停者模式包裝了一系列對象互相作用的方式,使得這些對象不必互相顯式引用,通過一個中介對象進行引用通知,進而對象之間解耦。當這些對象中的某些對象之間的互相作用發生改變時,不會立即影響到其他的對象間的互相作用。保證這些互相作用可以彼此獨立地變化。

2、模式圖解

Java描述設計模式(17):調停者模式一、生活場景二、調停者模式三、調停者模式總結四、源代碼位址

3、核心角色

  • 抽象調停者角色
定義出同僚對象到調停者對象的接口,其中主要方法是一個或多個事件方法。
  • 具體調停者角色
實作了抽象調停者所聲明的事件方法。具體調停者持有所有的具體同僚類,并負責協調各具體同僚對象的互動資訊。
  • 抽象同僚類角色
定義出調停者到同僚對象的接口。同僚對象隻持有調停者而不知道具體的同僚對象。
  • 具體同僚類角色
所有的具體同僚類均從抽象同僚類繼承而來,需要與其他同僚通信的時候,就與持有的調停者通信,調停者會負責與其他的同僚對象互動。

4、源碼實作

/**
 * 抽象調停者類
 */
interface Mediator {
    void notify (Colleague colleague);
}
/**
 * 抽象同僚類
 */
abstract class Colleague {
    /* 持有調停者對象 */
    private Mediator mediator;
    public Colleague(Mediator mediator){
        this.mediator = mediator;
    }
    public Mediator getMediator(){
        return mediator;
    }
}
/**
 * 具體調停者類
 */
class ConcreteMediator implements Mediator{
    private ConcreteColleagueA colleagueA ;
    private ConcreteColleagueB colleagueB ;
    public void setColleagueA(ConcreteColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }
    public void setColleagueB(ConcreteColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }
    @Override
    public void notify(Colleague colleague) {
        System.out.println("協調通知消息");
    }
}
/**
 * 具體同僚類
 */
class ConcreteColleagueA extends Colleague{
    public ConcreteColleagueA(Mediator mediator) {
        super(mediator);
    }
    public void operate(){
        getMediator().notify(this);
    }
}
class ConcreteColleagueB extends Colleague{
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
    }
    public void operation(){
        getMediator().notify(this);
    }
}           

三、調停者模式總結

  • 松散耦合
調停者模式通過把多個同僚對象之間的互動封裝到調停者對象裡面,進而使得同僚對象之間松散耦合。
  • 集中管理互動
多個同僚對象的互動,被封裝在調停者對象裡面集中管理,使得這些互動行為發生變化的時候,隻需要修改調停者對象就可以了。
  • 簡化對象間關系
沒有使用調停者模式的時候,同僚對象之間的關系通常是多對多的,引入調停者對象以後,調停者對象和同僚對象的關系通常變成雙向的一對多。
  • 模式的缺點
調停者模式的一個潛在缺點是,過度集中化,當同僚對象很多,互動非常、複雜時,會導緻調停者對象變得十分複雜,而且難于管理和維護。

四、源代碼位址

GitHub·位址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·位址
https://gitee.com/cicadasmile/model-arithmetic-parent