Android 中介者模式
Android 設計模式系列文章Android 23種設計模式
前言
面向物件的語言中,一個類肯定會和其它類產生關聯。而多個類相互作用會形成錯綜複雜的網狀結構。中介者模式就是為了簡化這種網狀結構應運而生的一種模式。它就像一箇中心點一樣。形成一對多的結構。使結構變得清晰。
定義
中介者模式將多對多相互作用轉化為一對多的相互作用。將物件的協作抽象化。
中介者模式舉例
我們開發一個軟體,假設這個時候有軟體、產品經理、UI各一個。當我們設計產品意見不同時,這個時候就需要一箇中介者(老大)來做決策。
1、定義三個崗位
先抽象出person
public abstract class Person { public Mediator mediator; public Person(Mediator mediator) { this.mediator = mediator; } // 執行 public abstract void action(); // 提出需求 public abstract void changed(); }
然後定義軟體、產品經理和UI
ublic class SoftWare extends Person { private static final String TAG = SoftWare.class.getSimpleName(); public SoftWare(Mediator mediator) { super(mediator); } @Override public void action() { Log.d(TAG,"修改程式碼"); } @Override public void changed() { Log.d(TAG,"提出修改軟體"); mediator.method(this); } } public class ProductManager extends Person { private static final String TAG = ProductManager.class.getSimpleName(); public ProductManager(Mediator mediator) { super(mediator); } @Override public void action() { Log.d(TAG,"修改需求"); } @Override public void changed() { Log.d(TAG,"提出修改需求"); mediator.method(this); } } public class UI extends Person { private static final String TAG = UI.class.getSimpleName(); public UI(Mediator mediator) { super(mediator); } @Override public void action() { Log.d(TAG,"修改UI"); } @Override public void changed() { Log.d(TAG,"提出修改UI"); mediator.method(this); } }
我們可以看到三個崗位的程式碼很簡單他們可以各自提出自己的意見和修改方案。然後交給中介者去協調其它崗位的同事應該怎麼做。接下來我們看中介者是如何操作的。
2、定義中介者
我們先抽象出中介者,然後給它一個協調方法method
public abstract class Mediator { public abstract void method(Person person); }
具體的中介者Leader
public class Leader extends Mediator { private static final String TAG = Leader.class.getSimpleName(); private SoftWare softWare; private ProductManager productManager; private UI ui; @Override public void method(Person person) { if (person == softWare) { Log.d(TAG,"軟體提出修改軟體,協調ui修改"); ui.action(); } else if(person == productManager) { Log.d(TAG,"產品經理提出修改需求,協調ui和軟體修改"); softWare.action(); ui.action(); } else if (person == ui) { Log.d(TAG,"ui提出修改介面,我覺得不合理,什麼都不做"); } } public void setSoftWare(SoftWare softWare) { this.softWare = softWare; } public void setProductManager(ProductManager productManager) { this.productManager = productManager; } public void setUi(UI ui) { this.ui = ui; } }
中介者的目的很明確,比如當你產品經理修改需求的時候。Leader覺得這個需求不錯, 就讓軟體和UI協作。去修改。如例子所示,當UI提出一個修改的時候。Leader覺得不合理,不用修改
3、執行
Leader leader = new Leader(); SoftWare softWare = new SoftWare(leader); ProductManager productManager = new ProductManager(leader); UI ui = new UI(leader); leader.setSoftWare(softWare); leader.setProductManager(productManager); leader.setUi(ui); softWare.changed(); productManager.changed(); ui.changed();
列印結果如下:
01-22 11:19:40.969 6192-6192/com.yink.designpattern.designpattern D/SoftWare: 提出修改軟體 01-22 11:19:40.969 6192-6192/com.yink.designpattern.designpattern D/Leader: 軟體提出修改軟體,協調ui修改 01-22 11:19:40.969 6192-6192/com.yink.designpattern.designpattern D/UI: 修改UI 01-22 11:19:40.969 6192-6192/com.yink.designpattern.designpattern D/ProductManager: 提出修改需求 01-22 11:19:40.969 6192-6192/com.yink.designpattern.designpattern D/Leader: 產品經理提出修改需求,協調ui和軟體修改 01-22 11:19:40.969 6192-6192/com.yink.designpattern.designpattern D/SoftWare: 修改程式碼 01-22 11:19:40.969 6192-6192/com.yink.designpattern.designpattern D/UI: 修改UI 01-22 11:19:40.969 6192-6192/com.yink.designpattern.designpattern D/UI: 提出修改UI 01-22 11:19:40.969 6192-6192/com.yink.designpattern.designpattern D/Leader: ui提出修改介面,我覺得不合理,什麼都不做
中介者模式小結:
1、中介者模式就是把網狀複雜結構優化為一對多結構。起到協調作用。
2、依賴關係並不複雜時不用特地使用中介者模式,反而更加複雜。
3、涉及修改一個物件需要去修改多個物件的時候。
寫在最後
其實中介者模式我們經常用。比如一個介面上有幾個按鈕,幾個顯示。他們之間相互影響。這個時候通常我們是把Activity當一箇中介者來實現。抽象者模式將行為和協作抽象化。把物件之間的依賴協作分開處理。降低系統的複雜性,提高可擴充套件性的作用。