设计模式-中介者模式(21)
定義
中介者模式(Mediator)也稱調停者模式,是一種比較簡單的模式。
英文:Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.
翻譯:用一個中介者對象封裝一系列對象(同事)的交互,中介者使各對象不需要顯示的相互作用,從而使其耦合松散,而且中介者可以獨立地改變它們之間的交互。
角色:
抽象中介者(Mediator)角色:該角色定義出同事對象到中介者對象的同一接口,用于各同事角色之間的通信。
具體中介者(Concrete Mediator)角色:該角色實現抽象中介者,它依賴于各個同事角色,并通過協調各同事角色實現協作行為。
抽象同事(Colleague)角色:該角色定義出中介者到同事對象的接口,同事對象只知道中介者而不知道其余的同事對象。
具體同事(Concrete Colleague)角色:該角色實現抽象同事類,每一個具體同事類都清楚自己在小范圍內的行為,而不知道大范圍內的目的。
/*** 抽象中介者模式*/ public abstract class Mediator {//中介者模式的業務邏輯方法,使封裝的對象不用顯示的相互作用public abstract void colleagueChanged(Colleague colleague); }/*** 具體中介者*/ public class ConcreteMediator extends Mediator{private ConcreteColleague1 c1;private ConcreteColleague2 c2;//中介者模式的業務邏輯方法,使封裝的對象不用顯示的相互作用public void colleagueChanged(Colleague c){c1.action();c2.action();}//工廠方法,創建同事對象public void createConcreteMediator(){c1 = new ConcreteColleague1(this);c2 = new ConcreteColleague2(this);}//獲取同事對象public ConcreteColleague1 getC1(){return c1;}//獲取同事對象public ConcreteColleague2 getC2(){return c2;} }/*** 抽象同事類*/ public abstract class Colleague {private Mediator mediator; //因為需要調用中介者的方法,所以要把中介者傳進來.如果是中介者方法為靜態方法則不必要//構造函數public Colleague(Mediator mediator) {this.mediator = mediator;}//getter和setter方法public Mediator getMediator() {return mediator;}public void setMediator(Mediator mediator) {this.mediator = mediator;}//抽象行動方法,由子類實現public abstract void action();//核心業務方法.這個方法看似是本對象和其他對象交互,其實是調用中介者的方法,把自己作為方法參數.委托中介者完成功能public void change(){this.mediator.colleagueChanged(this);}}/*** 具體同事類1*/ public class ConcreteColleague1 extends Colleague {//構造函數public ConcreteColleague1(Mediator mediator) {super(mediator);}@Overridepublic void action() {System.out.println("這是同事1的行動方法!");} }/*** 具體同事類2*/ public class ConcreteColleague2 extends Colleague {public ConcreteColleague2(Mediator mediator) {super(mediator);}@Overridepublic void action() {System.out.println("這是具體同事類2的方法!");} }源碼
優點?
- 減少類間的依賴。將類之間原有的一對多的依賴變成一對一的依賴,使得對象之間的關系更易理解和維護。
- 避免同事對象之間的過度耦合。同事類只依賴于中介者,這使同事類更易被復用,中介類和同事類可以相對獨立地演化。
- 中介者模式將對象的行為和對象間的協作抽象化,將對象在小尺度的行為上與其他對象的相互作用分開處理。
缺點
- 中介者模式降低了同事對象的復雜性,但增加了中介者類的復雜性。
- 中介者類經常充滿了各個具體同事類的關系協調代碼,這種代碼是不可復用的。
注意事項
中介者模式簡單,但是簡單不代表容易使用,它很容易被誤用和濫用。在面向對象的編程中,對象和對象之間必然會有依賴關系,如果某個類和其他類之間沒有任何依賴關系,那這個類就是一座孤島,它在系統中沒有存在的必要。一個類依賴多個類的情況是正常的,存在就有其合理性,但并不是只要有多個依賴關系就考慮使用中介者模式。在下列情況不適合使用中介者模式:
- 中介者模式不應當在責任劃分混亂時使用。通常的情況下,當一個初級設計師對面向對象的技術不熟悉時,會使一個系統在責任的分割上發生混亂。責任分割的混亂會使得系統中的對象與對象之間產生不適當的復雜關系。
- 中介者模式不應當對數據類和方法類使用。初級設計師常常會設計出這樣一中系統:讓一系列類只含有數據,另一些類只含有方法。
- 正確理解封裝類。封裝首先是行為,其次是行為所涉及的狀態。行為與狀態是不應當分割開來的。中介者模式用來管理很多對象的相互作用,以便使這些對象可以專注于自身的行為。
//看似是m1調用查找伴侶方法,其實是調用了agency.find(this),即m1執行此方法調用中介所的find方法,而本身作為一個參數傳遞過去. m2.findPartner();} }
個人總結:
1.在實例化同事類的時候,中介者作為構造參數media,并在構造函數中執行media.regist(this)把自己注冊到中介者中去。
2.實例化的同事類調用方法(和其他類交互的方法),底層為中介者調用find(this)把自己作為參數,讓中介者替自己執行和其他類交互的方法(核心業務,各個類不需要顯示調用)。
源碼
/*** 中介者-聊天室*/ public class Chat {public static void showMessage(User user,String msg){System.out.println(new SimpleDateFormat("yyyy-dd-hh-mm-ss").format(new Date())+" "+user.getName()+": "+msg);} }/*** 聊天用戶*/ public class User {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public User(String name) {this.name = name;}public void sendMsg(String msg){Chat.showMessage(this,msg); //中介者靜態方法,所以同事類中不需要有中介者對象 } }/*** 測試*/ public class MainDemo {public static void main(String[] args) {User u1 = new User("sywer");User u2 = new User("catalin");u1.sendMsg("hello!");u2.sendMsg("bye");} }源碼
?
轉載于:https://www.cnblogs.com/aeolian/p/8921688.html
總結
以上是生活随笔為你收集整理的设计模式-中介者模式(21)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看win10版本方法,及win10升级
- 下一篇: .NET CORE 2.1 导出exce