欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android編程設(shè)計模式之中介者模式詳解

 更新時間:2017年12月27日 11:22:30   作者:蹲街式等待  
這篇文章主要介紹了Android編程設(shè)計模式之中介者模式,結(jié)合實例形式詳細分析了Android中介者模式的概念、原理、使用場景、用法及相關(guān)操作注意事項,需要的朋友可以參考下

本文實例講述了Android編程設(shè)計模式之中介者模式。分享給大家供大家參考,具體如下:

一、介紹

中介者模式(Mediator Pattern)也稱為調(diào)解者模式或調(diào)停者模式,Mediator本身就有調(diào)停者和調(diào)解者的意思。

在日常生活中調(diào)停者或調(diào)解者這個角色我們見得比較多的是“和事老”,也就是說調(diào)解兩個有爭端的人的角色,舉個不恰當?shù)睦?,比如爸媽吵架,孩子或者雙方父母則會出面勸架或阻止爭吵,這里孩子或雙方父母則是充當?shù)氖钦{(diào)解者的模式。

而對于中介呢?大家平時聽得最多的莫過于房產(chǎn)中介了,在房地產(chǎn)飛速發(fā)展的今天,各種房產(chǎn)中介公司如雨后春筍般冒出來,房產(chǎn)中介承擔的責任很簡單,就是在買房者與賣房者之間建立一座橋梁溝通兩者,比如小民現(xiàn)在手里有套房子需要出售,于是他找房產(chǎn)中介并告訴房產(chǎn)中介房子的期望售價和房子的相關(guān)信息,然后房產(chǎn)中介則將這些信息收集匯總有時還會美化一番,然后把廣告掛在櫥窗里等待買房者,如果有人有意向購買這套房子,比如這里以小輝為例,房產(chǎn)中介就會告訴小輝關(guān)于這套房產(chǎn)的相關(guān)信息,如房齡、售價等,有時還會帶小輝去房子里實際參觀一番,最終小輝將自己的意愿告訴房產(chǎn)中介,再由房產(chǎn)中介去與小民進行溝通。也就是說在整個房產(chǎn)協(xié)商的過程中,小民和小輝買賣雙方是很少直接接觸的,大多數(shù)情況下都是通過房產(chǎn)中介來傳達信息,可能只有在最終進行房產(chǎn)交接時小民和小輝才會正式見面。

這就是我們現(xiàn)實生活中常見的調(diào)解者與中介者,但是,這里我們要說的中介者模式比起上述的兩個例子來要復雜的多,上面我們所述的例子中,中介者或調(diào)解者所要協(xié)調(diào)的也就兩類對象,而我們的中介者模式中需要協(xié)調(diào)的是多類對象。

這里還是舉一個小例子來說明,本書的閱讀者大多都是IT從業(yè)者,說得更準確些都是做APP的,一般來說,一個做APP的公司可以分為幾大模塊:運維、產(chǎn)品、開發(fā)、設(shè)計還有測試,每當一個新APP開始制作或者發(fā)布新版本需要制作之前,公司會開一個研討會,運維負責市場了解用戶使用傾向,研發(fā)的會說用戶反映界面不好看要求修改界面……這樣大家你一句我一句的討論一半天也沒有啥實質(zhì)性結(jié)果,主要原因在于大家都站在自己的立場考慮問題,這樣的團隊研討會即使再開下去也沒什么意義,這時候如果有一個人不屬于運維、產(chǎn)品、開發(fā)、設(shè)計任一方的人站出來說,大家把各自的意見都跟我說,由我來權(quán)衡并作出最終的決定,不管決定如何你們都要照做。因為這個人不代表任何一方,于是大家都全票表示肯定,這么一來一個方案很快就定下來,而這個作出最終決定的人我們就稱之為中介者,這里的中介者與我們的中介者模式一樣面對的是多類對象,這里其實大家可以看到中介者模式的一些特性,每一個中介者都會知道所有的同事,比如上面我們所說的運維、產(chǎn)品、開發(fā)、設(shè)計還有測試,但是這些同事呢可以互不相識,而中介者不屬于同事的任何一方,也不偏袒任何一方,這么一說相信大家對中介者模式會有一個非常清晰的了解。

二、定義

中介者模式包裝了一系列對象互相作用的方式,使得這些對象不必相互明顯作用。從而使它們可以松散偶合。當某些對象之間的作用發(fā)生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。中介者模式將多對多的相互作用轉(zhuǎn)化為一對多的相互作用。中介者模式將對象的行為和協(xié)作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。

三、使用場景

當對象之間的交互操作很多且每個對象的行為操作都依賴彼此時,為防止在修改一個對象的行為時,同時涉及修改很多其他對象的行為,可采用中介者模式,來解決緊耦合問題。該模式將對象之間的多對多關(guān)系變成一對多關(guān)系,中介者對象將系統(tǒng)從網(wǎng)狀結(jié)構(gòu)變成以調(diào)停者為中心的星形結(jié)構(gòu),達到降低系統(tǒng)的復雜性,提高可擴展性的作用。

四、中介者模式的UML類圖

UML類圖:

角色介紹:

Mediator:抽象的中介者角色,定義了同事對象到中介者的接口。

ConcreteMediator:具體的中介者角色,從具體的同事對象接收消息,同時向具體的同事對象發(fā)出命令。

Colleague:抽象同事類角色,定義了中介者對象的接口,只知道中介而不知道其他同事對象。

ConcreteColleagueA,ConcreteColleagueB:具體的同事類角色,每個具體同事類都知道本身在小范圍內(nèi)的行為,而不知道他在大范圍中的行為。

模板代碼:

抽象的中介者:

public interface Mediator {
  void change();
}

具體的中介者:

public class ConcreteMediator implements Mediator {
  public ConcreteColleagueA concreteColleagueA;
  public ConcreteColleagueB concreteColleagueB;
  public void setConcreteColleagueA(ConcreteColleagueA concreteColleagueA) {
    this.concreteColleagueA = concreteColleagueA;
  }
  public void setConcreteColleagueB(ConcreteColleagueB concreteColleagueB) {
    this.concreteColleagueB = concreteColleagueB;
  }
  @Override
  public void change() {
    concreteColleagueA.action();
    concreteColleagueB.action();
  }
}

抽象的同事:

public abstract class Colleague {
  public Mediator mediator;
  public Colleague(Mediator mediator) {
    this.mediator = mediator;
  }
  public abstract void action();
}

具體的同事A:

public class ConcreteColleagueA extends Colleague {
  public ConcreteColleagueA(Mediator mediator) {
    super(mediator);
  }
  @Override
  public void action() {
    System.out.println("交給中介做A的事情");
  }
}

具體的同事B:

public class ConcreteColleagueB extends Colleague {
  public ConcreteColleagueB(Mediator mediator) {
    super(mediator);
  }
  @Override
  public void action() {
    System.out.println("交給中介做B的事情");
  }
}

五、簡單示例

在電腦中,主機部分主要分為:CPU、內(nèi)存、顯卡、IO設(shè)備,而將它們整合起來的就是主板,這里主板就是一個中介者。以此為例。

抽象中介者:

public abstract class Mediator {
  /**
   * 同事對象改變時通知中介者的方法
   * 在同事對象改變時由中介者去通知其他的同事對象
   * 
   * @param c 同事對象
   */
  public abstract void changed(Colleague c);
}

抽象同事:

public abstract class Colleague {
  protected Mediator mediator;//每一個同事都該知道其中介者
  public Colleague(Mediator mediator) {
    this.mediator = mediator;
  }
}

CPU同事:

public class CPU extends Colleague{
  private String dataVideo, dataSound; //視頻和音頻數(shù)據(jù)
  public CPU(Mediator mediator) {
    super(mediator);
  }
  /**
   * 獲取視頻數(shù)據(jù)
   * 
   * @return 視頻數(shù)據(jù)
   */
  public String getDataVideo(){
    return dataVideo;
  }
  /**
   * 獲取音頻數(shù)據(jù)
   * 
   * @return 音頻數(shù)據(jù)
   */
  public String getDataSound(){
    return dataSound;
  }
  /**
   * 解碼數(shù)據(jù)
   * 
   * @param data音、視頻數(shù)據(jù)
   */
  public void decodeData(String data){
    //分割音、視頻數(shù)據(jù)
    String[] tmp = data.split(",");
    //解析音、視頻數(shù)據(jù)
    dataVideo = tmp[0];
    dataSound = tmp[1];
    //告訴中介者自身狀態(tài)改變
    mediator.changed(this);
  }
}

光驅(qū)同事:

public class CDDevice extends Colleague{
  private String data; //視頻數(shù)據(jù)
  public CDDevice(Mediator mediator) {
    super(mediator);
  }
  /**
   * 讀取視頻數(shù)據(jù)
   * 
   * @return 視頻數(shù)據(jù)
   */
  public String read(){
    return data;
  }
  /**
   * 加載視頻數(shù)據(jù)
   * 
   * @return 音頻數(shù)據(jù)
   */
  public void load(){
    data = "視頻數(shù)據(jù),音頻數(shù)據(jù)";
    //告訴中介者自身狀態(tài)改變
    mediator.changed(this);
  }
}

顯卡同事:

public class GraphicsCard extends Colleague{
  public GraphicsCard(Mediator mediator) {
    super(mediator);
  }
  /**
   * 播放視頻數(shù)據(jù)
   * 
   * @param 視頻數(shù)據(jù)
   */
  public void videoPlay(String data){
    System.out.println("視頻:" + data);
  }
}

聲卡同事:

public class SoundCard extends Colleague{
  public SoundCard(Mediator mediator) {
    super(mediator);
  }
  /**
   * 播放音頻數(shù)據(jù)
   * 
   * @param 音頻數(shù)據(jù)
   */
  public void soundPlay(String data){
    System.out.println("音頻:" + data);
  }
}

主板中介者:

public class MainBoard extends Mediator{
  private CDDevice cdDevice; //光驅(qū)設(shè)備
  private CPU cpu; //CPU
  private SoundCard soundCard; //聲卡設(shè)備
  private GraphicsCard graphicsCard; //顯卡設(shè)備
  @Override
  public void changed(Colleague c) {
    //如果光驅(qū)讀取了數(shù)據(jù)
    if(c == cdDevice){
      handleCD((CDDevice) c);
    }
    //如果CPU處理完數(shù)據(jù)
    else if(c == cpu){
      handleCD((CPU) c);
    }
  }
  /**
   * 處理光驅(qū)讀取數(shù)據(jù)后與其他設(shè)備的交互
   * 
   * @param cdDevice 光驅(qū)設(shè)備
   */
  public void handleCD(CDDevice cdDevice){
    cpu.decodeData(cdDevice.read());
  }
  /**
   * 處理CPU讀取數(shù)據(jù)后與其他設(shè)備的交互
   * 
   * @param cpu CPU
   */
  public void handleCD(CPU cpu){
    soundCard.soundPlay(cpu.getDataSound());
    graphicsCard.videoPlay(cpu.getDataVideo());
  }
  /**
   * 設(shè)置CD設(shè)備
   * 
   * @param CDDevice CD設(shè)備
   */
  public void setCDDevice(CDDevice cdDevice){
    this.cdDevice = cdDevice;
  }
  /**
   * 設(shè)置CPU
   * 
   * @param cpu CPU
   */
  public void setCPU(CPU cpu){
    this.cpu = cpu;
  }
  /**
   * 設(shè)置聲卡設(shè)備
   * 
   * @param soundCard 聲卡設(shè)備
   */
  public void setSoundCard(SoundCard soundCard){
    this.soundCard = soundCard;
  }
  /**
   * 設(shè)置顯卡設(shè)備
   * 
   * @param graphicsCard 顯卡設(shè)備
   */
  public void setGraphicsCard(GraphicsCard graphicsCard){
    this.graphicsCard = graphicsCard;
  }
}

播放電影:

public class Client {
  public static void main(String[] args) {
    //構(gòu)造主板對象
    MainBoard mediator = new MainBoard();
    //分別構(gòu)造各個零件
    CDDevice cd = new CDDevice(mediator);
    CPU cpu = new CPU(mediator);
    GraphicsCard gc = new GraphicsCard(mediator);
    SoundCard sc = new SoundCard(mediator);
    //將各個零件安裝到主板
    mediator.setCDDevice(cd);
    mediator.setCPU(cpu);
    mediator.setGraphicsCard(gc);
    mediator.setSoundCard(sc);
    //播放電影
    cd.load();
  }
}

結(jié)果:

音頻:音頻數(shù)據(jù)
視頻:視頻數(shù)據(jù)

可以看出中介者模式將多對多的相互作用轉(zhuǎn)化為一對多的相互作用,將系統(tǒng)從網(wǎng)狀結(jié)構(gòu)變?yōu)橐灾薪檎邽橹行牡男切谓Y(jié)構(gòu)(這里就是主板),達到降低系統(tǒng)的復雜性,提高可擴展性。

六、Android源碼中的中介者模式

1、Keyguard解鎖屏

詳細機制參考:Android4.0 Keyguard解鎖屏機制

七、總結(jié)

其實在Android開發(fā)中我們可能無意間就使用了中介者模式,比如登錄注冊界面,我們使用EditText的addTextChangedListener監(jiān)聽輸入密碼的位數(shù)、用戶名是否為空,密碼與確認密碼是否一致等等判斷時,此時多個控件交互,就是由Activity充當中介者來協(xié)調(diào)。

優(yōu)點:

適當?shù)厥褂弥薪檎吣J娇梢员苊馔骂愔g的過度耦合,使得各同事類之間可以相對獨立地使用。

使用中介者模式可以將對象的行為和協(xié)作進行抽象,能夠比較靈活的處理對象間的相互作用。

使用中介者模式可以將對象間多對多的關(guān)聯(lián)轉(zhuǎn)變?yōu)橐粚Χ嗟年P(guān)聯(lián),使對象間的關(guān)系易于理解和維護。

缺點:

中介者模式是一種比較常用的模式,也是一種比較容易被濫用的模式。對于大多數(shù)的情況,同事類之間的關(guān)系不會復雜到混亂不堪的網(wǎng)狀結(jié)構(gòu),因此,大多數(shù)情況下,將對象間的依賴關(guān)系封裝的同事類內(nèi)部就可以的,沒有必要非引入中介者模式。濫用中介者模式,只會讓事情變的更復雜。所以,我們決定使用中介者模式之前要多方考慮、權(quán)衡利弊。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

最新評論