協調多個物件之間的互動——中介者模式(三)
阿新 • • 發佈:2019-02-03
20.3 完整解決方案
為了協調介面元件物件之間的複雜互動關係,Sunny公司開發人員使用中介者模式來設計客戶資訊管理視窗,其結構示意圖如圖20-7所示:
圖20-7 引入了中介者類的“客戶資訊管理視窗”結構示意圖
圖20-7只是一個重構之後的結構示意圖,在具體實現時,為了確保系統具有更好的靈活性和可擴充套件性,我們需要定義抽象中介者和抽象元件類,其中抽象元件類是所有具體元件類的公共父類,完整類圖如圖20-8所示:
圖20-8 重構後的“客戶資訊管理視窗”結構圖
在圖20-8中,Component充當抽象同事類,Button、List、ComboBox和TextBox充當具體同事類,Mediator 充當抽象中介者類,ConcreteMediator充當具體中介者類,ConcreteMediator維持了對具體同事類的引用,為了簡化ConcreteMediator類的程式碼,我們在其中只定義了一個Button物件和一個TextBox物件。完整程式碼如下所示:
//抽象中介者 abstract class Mediator { public abstract void componentChanged(Component c); } //具體中介者 class ConcreteMediator extends Mediator { //維持對各個同事物件的引用 public Button addButton; public List list; public TextBox userNameTextBox; public ComboBox cb; //封裝同事物件之間的互動 public void componentChanged(Component c) { //單擊按鈕 if(c == addButton) { System.out.println("--單擊增加按鈕--"); list.update(); cb.update(); userNameTextBox.update(); } //從列表框選擇客戶 else if(c == list) { System.out.println("--從列表框選擇客戶--"); cb.select(); userNameTextBox.setText(); } //從組合框選擇客戶 else if(c == cb) { System.out.println("--從組合框選擇客戶--"); cb.select(); userNameTextBox.setText(); } } } //抽象元件類:抽象同事類 abstract class Component { protected Mediator mediator; public void setMediator(Mediator mediator) { this.mediator = mediator; } //轉發呼叫 public void changed() { mediator.componentChanged(this); } public abstract void update(); } //按鈕類:具體同事類 class Button extends Component { public void update() { //按鈕不產生互動 } } //列表框類:具體同事類 class List extends Component { public void update() { System.out.println("列表框增加一項:張無忌。"); } public void select() { System.out.println("列表框選中項:小龍女。"); } } //組合框類:具體同事類 class ComboBox extends Component { public void update() { System.out.println("組合框增加一項:張無忌。"); } public void select() { System.out.println("組合框選中項:小龍女。"); } } //文字框類:具體同事類 class TextBox extends Component { public void update() { System.out.println("客戶資訊增加成功後文本框清空。"); } public void setText() { System.out.println("文字框顯示:小龍女。"); } }
編寫如下客戶端測試程式碼:
class Client { public static void main(String args[]) { //定義中介者物件 ConcreteMediator mediator; mediator = new ConcreteMediator(); //定義同事物件 Button addBT = new Button(); List list = new List(); ComboBox cb = new ComboBox(); TextBox userNameTB = new TextBox(); addBT.setMediator(mediator); list.setMediator(mediator); cb.setMediator(mediator); userNameTB.setMediator(mediator); mediator.addButton = addBT; mediator.list = list; mediator.cb = cb; mediator.userNameTextBox = userNameTB; addBT.changed(); System.out.println("-----------------------------"); list.changed(); } }
編譯並執行程式,輸出結果如下:
--單擊增加按鈕-- 列表框增加一項:張無忌。 組合框增加一項:張無忌。 客戶資訊增加成功後文本框清空。 ----------------------------- --從列表框選擇客戶-- 組合框選中項:小龍女。 文字框顯示:小龍女。 |