本文源碼:GitHub·點這裏 || GitEE·點這裏java
在公司的平常安排中,一般劃分多個部門,每一個部門又會分爲不一樣的小組,部門經理的一項核心工做就是協調部門小組之間的工做,例如開發小組,產品小組,小組的需求統一彙總到經理,經理統一安排和協調。git
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); } }
執行結果github
【張三】發起協調任務:須要產品文檔 經理接收【張三】的協調任務:須要產品文檔 經理轉發【張三】協調任務,@【李四】 【李四】收到【張三】協調任務:[須要產品文檔]
調停者模式是對象的行爲模式。調停者模式包裝了一系列對象相互做用的方式,使得這些對象沒必要相互顯式引用,經過一箇中介對象進行引用通知,從而對象之間解耦。當這些對象中的某些對象之間的相互做用發生改變時,不會當即影響到其餘的對象間的相互做用。保證這些相互做用能夠彼此獨立地變化。ide
定義出同事對象到調停者對象的接口,其中主要方法是一個或多個事件方法。this
實現了抽象調停者所聲明的事件方法。具體調停者持有全部的具體同事類,並負責協調各具體同事對象的交互信息。code
定義出調停者到同事對象的接口。同事對象只持有調停者而不知道具體的同事對象。對象
全部的具體同事類均從抽象同事類繼承而來,須要與其餘同事通訊的時候,就與持有的調停者通訊,調停者會負責與其餘的同事對象交互。blog
/** * 抽象調停者類 */ 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