真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android中責(zé)任鏈模式的作用是什么

Android中責(zé)任鏈模式的作用是什么,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給創(chuàng)新互聯(lián)公司一個展示的機(jī)會來證明自己,這并不會花費(fèi)您太多時間,或許會給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗,一切以用戶為中心。

一、介紹

責(zé)任鏈模式(Iterator Pattern),是行為型設(shè)計模式之一。什么是”鏈“?我們將多個節(jié)點(diǎn)首尾相連所構(gòu)成的模型稱為鏈,比如生活中常見的鎖鏈,就是由一個個圓角長方形的鐵環(huán)串起來的結(jié)構(gòu)。對于鏈?zhǔn)浇Y(jié)構(gòu),每個節(jié)點(diǎn)都可以被拆開再連接,因此,鏈?zhǔn)浇Y(jié)構(gòu)也具有很好的靈活性。將這樣一種結(jié)構(gòu)應(yīng)用于編程領(lǐng)域,將每一個節(jié)點(diǎn)看作是一個對象,每一個對象擁有不同的處理邏輯,將一個請求從鏈?zhǔn)降氖锥税l(fā)出,沿著鏈的路徑依次傳遞給每一個節(jié)點(diǎn)對象,直至有對象處理這個請求為止,我們將這樣的一種模式稱為責(zé)任鏈模式,這樣的解釋是不是更通俗易懂呢?我們還是看看責(zé)任鏈模式的標(biāo)準(zhǔn)定義。

二、定義

使多個對象都有機(jī)會處理請求,從而避免了請求的發(fā)送者和接收者直接的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞請求,直到有對象處理它為止。

三、使用場景

多個對象可以處理同一請求,但具體由哪個對象處理則在運(yùn)行時動態(tài)決定。

在請求處理者不明確的情況下向多個對象中的一個提交一個請求。

需要動態(tài)指定一組對象處理請求。

四、責(zé)任鏈模式的UML類圖

UML類圖:

Android中責(zé)任鏈模式的作用是什么

角色介紹:

Handler:抽象處理者角色,聲明一個請求處理的方法,并在其中保持一個對下一個處理節(jié)點(diǎn)Handler對象的引用。

ConcreteHandler:具體處理者角色,對請求進(jìn)行處理,如果不能處理則將該請求轉(zhuǎn)發(fā)給下一個節(jié)點(diǎn)上的處理對象。

五、簡單實現(xiàn)

這個例子我覺得很貼切。我們在公司有各種原因需要報銷費(fèi)用,首先我們要找我們的上級領(lǐng)導(dǎo)去審批,報銷額度如果在領(lǐng)導(dǎo)的權(quán)限范圍內(nèi),那就審批通過,否則領(lǐng)導(dǎo)在找自己的上級去審批,以此類推。

抽象領(lǐng)導(dǎo)類:

public abstract class Leader {
  /**
   * 上級領(lǐng)導(dǎo)處理者
   */
  protected Leader nextHandler;
  /**
   * 處理報賬請求
   * 
   * @param money 能批復(fù)的報賬額度 
   * 
   */
  public final void handleRequest(int money){
    System.out.println(getLeader());
    if(money <=limit()){
      handle(money);
    }else{
      System.out.println("報賬額度不足,提交領(lǐng)導(dǎo)");
      if(null != nextHandler){
        nextHandler.handleRequest(money);
      }
    }
  }
  /**
   * 自身能批復(fù)的額度權(quán)限
   * 
   * @return 額度
   */
  public abstract int limit();
  /**
   * 處理報賬行為
   * 
   * @param money 具體金額
   */
  public abstract void handle(int money);
  /**
   * 獲取處理者
   * 
   * @return 處理者
   */
  public abstract String getLeader();
}

在這個抽象的領(lǐng)導(dǎo)類中只做了兩件事,一是定義了兩個抽象接口方法來確定一個領(lǐng)導(dǎo)者應(yīng)有的行為和屬性,二是聲明了一個處理報賬請求的方法來確定當(dāng)前領(lǐng)導(dǎo)是否有能力處理報賬請求,如果沒有這個權(quán)限,則將該請求轉(zhuǎn)發(fā)給上級領(lǐng)導(dǎo)處理。接下來則是各個領(lǐng)導(dǎo)類的實現(xiàn):

組長(額度1000):

public class GroupLeader extends Leader{
  @Override
  public int limit() {
    return 1000;
  }
  @Override
  public void handle(int money) {
    System.out.println("組長批復(fù)報銷"+ money +"元");
  }
  @Override
  public String getLeader() {
    return "當(dāng)前是組長";
  }
}

主管(額度5000):

public class Director extends Leader{
  @Override
  public int limit() {
    return 5000;
  }
  @Override
  public void handle(int money) {
    System.out.println("主管批復(fù)報銷"+ money +"元");
  }
  @Override
  public String getLeader() {
    return "當(dāng)前是主管";
  }
}

經(jīng)理(額度10000):

public class Manager extends Leader{
  @Override
  public int limit() {
    return 10000;
  }
  @Override
  public void handle(int money) {
    System.out.println("經(jīng)理批復(fù)報銷"+ money +"元");
  }
  @Override
  public String getLeader() {
    return "當(dāng)前是經(jīng)理";
  }
}

老板(額度…):

public class Boss extends Leader{
  @Override
  public int limit() {
    return Integer.MAX_VALUE;
  }
  @Override
  public void handle(int money) {
    System.out.println("老板批復(fù)報銷"+ money +"元");
  }
  @Override
  public String getLeader() {
    return "當(dāng)前是老板";
  }
}

發(fā)起申請:

public class Client {
  public static void main(String[] args) {
    //構(gòu)造各個領(lǐng)導(dǎo)對象
    GroupLeader groupLeader = new GroupLeader();
    Director director = new Director();
    Manager manager = new Manager();
    Boss boss = new Boss();
    //設(shè)置上級領(lǐng)導(dǎo)處理者對象
    groupLeader.nextHandler = director;
    director.nextHandler = manager;
    manager.nextHandler = boss;
    //發(fā)起報賬申請
    groupLeader.handleRequest(8000);
  }
}

結(jié)果:

當(dāng)前是組長
報賬額度不足,提交領(lǐng)導(dǎo)
當(dāng)前是主管
報賬額度不足,提交領(lǐng)導(dǎo)
當(dāng)前是經(jīng)理
經(jīng)理批復(fù)報銷8000元

責(zé)任鏈模式非常靈活,請求的發(fā)起可以從責(zé)任鏈的任何一個節(jié)點(diǎn)開始,也可以改變內(nèi)部的傳遞規(guī)則。比如主管不在,我們完全可以跨過主管直接從組長那里轉(zhuǎn)到經(jīng)理。

對于責(zé)任鏈中的一個處理者對象,有兩個行為。一是處理請求,二是將請求傳遞到下一節(jié)點(diǎn),不允許某個處理者對象在處理了請求后又將請求傳送給上一個節(jié)點(diǎn)的情況。

對于一條責(zé)任鏈來說,一個請求最終只有兩種情況。一是被某個處理對象所處理,另一個是所有對象均未對其處理,對于前一種情況我們稱為純的責(zé)任鏈模式,后一種為不純的責(zé)任鏈。實際中大多為不純的責(zé)任鏈。

六、Android源碼中的責(zé)任鏈模式

1、View事件的分發(fā)處理

ViewGroup事件投遞的遞歸調(diào)用就類似于一條責(zé)任鏈,一旦其尋找到責(zé)任者,那么將由責(zé)任者持有并消費(fèi)掉該次事件,具體體現(xiàn)在View的onTouchEvent方法中返回值的設(shè)置,如果返回false,那么意味著當(dāng)前的View不會是該次的責(zé)任人,將不會對其持有;如果返回true,此時View會持有該事件并不再向外傳遞。

七、總結(jié)

優(yōu)點(diǎn):

可以對請求者和處理者的關(guān)系解耦,提高代碼的靈活性。

缺點(diǎn):

每次都需要對鏈中請求處理者遍歷,如果處理者太多那么遍歷必定會影響性能,特別是在一些遞歸調(diào)用者中,要慎用。

看完上述內(nèi)容,你們掌握Android中責(zé)任鏈模式的作用是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


名稱欄目:Android中責(zé)任鏈模式的作用是什么
分享路徑:http://weahome.cn/article/gjcoed.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部