設計模式的藝術 行為型模式之中介者模式
阿新 • • 發佈:2018-12-16
前言
微信有一個群聊功能,群聊中的資訊你不需要加別人為好友就可以接收的到資訊,因為群的機制,極大的減少了使用者之間的兩兩通訊,在軟體設計中,也有類似於微信使用者之間的關係,我們也可以借鑑微信群的模式,來降低物件與物件之間的互動,使得系統的耦合度大大降低
什麼是中介者模式 Mediator Pattern
用一箇中介者物件來封裝一系列的物件互動,中介者使得物件不需要顯式的互相引用,從而使得其耦合鬆散,而且可以獨立地改變它們之間的互動,中介者模式又稱之為調停者模式,它是一種物件行為型模式
中介者模式的優點
(1)、中介者模式簡化了物件之間的互動,它用中介者和同事的一對多互動代替了原來同事之間的多對多互動,一對多關係更容易理解,維護,擴充套件,將原來難以理解的網狀結構轉換成為相對簡單的星型結構
(2)、中介者模式可將同事物件解耦。中介者有利於各同事之間的鬆耦合,可以獨立地改變和複用每一個同事和中介者,增加新的中介者和新的同事都比較方便,更好地符合開閉原則
(3)、可以減少大量同事子類生成,中介者將原來分佈於多個物件間的行為集中在一起,改變這些行為只需要生成新的中介者子類即可,這使得各個同事類可以被複用,無須對同事類進行擴充套件
中介者模式的缺點
在具體中介者中包含了大量同事之間的互動細節,可能會使得具體中介者類非常複雜,使得系統難以維護
中介者模式適用的場景
(1)、系統中物件之間存在複雜的引用關係,系統結構混亂且難以理解
(2)、一個物件由於引用了其他很多物件並且直接和這些物件直接通訊,導致難以複用該物件
(3)、想通過一箇中間類來封裝多個類的行為,而又不想生成太多的子類,可以通過引入中介者類來實現,在中介者中定義物件互動的公共行為,如果需要改變行為則可以增加新的具體中介者類
中介者模式的具體實現
目錄結構
抽象同事類
package com.company.component; import com.company.Mediator; //抽象同事類 public abstract class Component { protected Mediator mediator; public void setMediator(Mediator mediator) { this.mediator = mediator; } //轉發呼叫 public void changed(){ mediator.componentChanged(this); } public abstract void update(); }
具體同事類
package com.company.component; //按鈕類:具體同事類 public class Button extends Component { @Override public void update() { //按鈕不產生相應 } }
package com.company.component; //組合框類:具體同事類 public class ComboBox extends Component { @Override public void update() { System.out.println("組合框增加一項:張無忌"); } public void select(){ System.out.println("組合框選中項:小龍女"); } }
package com.company.component; //檔案標籤類:具體同事類 public class Label extends Component { @Override public void update() { System.out.println("文字標籤內容改變,客戶資訊總數加一"); } }
package com.company.component; //列表框類:具體同事類 public class List extends Component { @Override public void update() { System.out.println("列表框增加一項:張無忌"); } public void select(){ System.out.println("列表框選中項:小龍女"); } }
package com.company.component; //文字框類:具體同事類 public class TextBox extends Component { @Override public void update() { System.out.println("客戶資訊增加成功後文本框清空"); } public void setText(){ System.out.println("文字框顯示:小龍女"); } }
抽象中介者類
package com.company; import com.company.component.Component; //抽象中介者 public abstract class Mediator { public abstract void componentChanged(Component component); }
具體中介者類
package com.company; import com.company.component.*; //具體中介者 public class ConcreteMediator extends Mediator { //維持對各個物件的引用 public Button addButton; public List list; public TextBox userNameTextBox; public ComboBox cb; @Override //封裝同事物件之間的互動 public void componentChanged(Component component) { //單擊按鈕 if(component==addButton){ System.out.println("--單擊增加按鈕--"); list.update(); cb.update(); userNameTextBox.update(); } //從列表框選擇客戶 else if(component==list){ System.out.println("--從列表框選擇客戶--"); cb.select(); userNameTextBox.setText(); }else if(component==cb){ System.out.println("--從組合框選擇客戶--"); cb.select(); userNameTextBox.setText(); } } }
package com.company; import com.company.component.Component; import com.company.component.Label; public class SubConcreteMediator extends ConcreteMediator { //增加對Label物件的引用 public Label label; //封裝同事物件之間的互動 public void componentChanged(Component component) { //單擊按鈕 if(component==addButton){ System.out.println("--單擊增加按鈕--"); list.update(); cb.update(); userNameTextBox.update(); label.update(); //文字標籤更新 } //從列表框選擇客戶 else if(component==list){ System.out.println("--從列表框選擇客戶--"); cb.select(); userNameTextBox.setText(); }else if(component==cb){ System.out.println("--從組合框選擇客戶--"); cb.select(); userNameTextBox.setText(); } } }
測試類
package com.company; import com.company.component.*; public class Main { public static void main(String[] args) { /*定義中介者物件 Mediator mediator;*/ //用新的具體中介者定義中介者物件 SubConcreteMediator mediator; mediator=new SubConcreteMediator(); //定義同事物件 Button addBT=new Button(); List list=new List(); ComboBox cb=new ComboBox(); TextBox userNameTB=new TextBox(); Label label=new Label(); addBT.setMediator(mediator); list.setMediator(mediator); cb.setMediator(mediator); userNameTB.setMediator(mediator); label.setMediator(mediator); ((ConcreteMediator) mediator).addButton=addBT; ((ConcreteMediator) mediator).list=list; ((ConcreteMediator) mediator).cb=cb; ((ConcreteMediator) mediator).userNameTextBox=userNameTB; mediator.label=label; addBT.changed();; System.out.println("----------------------"); list.changed(); } }
轉載請註明出處,掌聲送給社會人