<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    細(xì)心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點(diǎn)粗墨,七八筆買賣,九十道人情。

    BlogJava 聯(lián)系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
    其實(shí)Chain of Responsibility的概念,即使是一個(gè)剛學(xué)程式設(shè)計(jì)的新手也會(huì)用到,一個(gè)簡單的 if...else if ... else 流程控制就有Chain of Responsibility的概念:
    if(/* 符合請(qǐng)求條件一 */)
        // 執(zhí)行請(qǐng)求一
    else if(/* 符合請(qǐng)求條件二 */)
        // 執(zhí)行請(qǐng)求二
    else
        // 執(zhí)行預(yù)設(shè)請(qǐng)求或顯示訊息
     
    這是從結(jié)構(gòu)化程式設(shè)計(jì)的觀點(diǎn)來看Chain of Responsibility的概念,若使用物件的觀點(diǎn)來看Chain of Responsibility的話,有一個(gè)較佳的例子就是Java的例外處理機(jī)制,當(dāng)程式中發(fā)生例外時(shí),也比會(huì)catch所捕捉的例外是否符合,如果符合就執(zhí)行所設(shè)定的處理,如果都沒有比對(duì)到適當(dāng)?shù)睦馕锛蜁?huì)將例外丟出try...catch區(qū)塊之外。

    Gof 的書 中給定Chain of Responsibility目的為:使多個(gè)物件都有機(jī)會(huì)處理請(qǐng)求,以避免請(qǐng)求的發(fā)送者與接收者之間的耦合關(guān)係,將這些物件組合為一個(gè)鏈,並沿著這個(gè)鏈傳遞該請(qǐng)求,直到有物件處理它為止。

    先用一個(gè)例子來說明使用if...else的方式來處理請(qǐng)求:
    • IHandler.java
    public interface IHandler {
    public void handle();
    }

    • SymbolHandler.java
    public class SymbolHandler implements IHandler { 
    public void handle() {
    System.out.println("Symbol has been handled");
    }
    }

    • CharacterHandler.java
    public class CharacterHandler implements IHandler { 
    public void handle() {
    System.out.println("Character has been handled");
    }
    }

    • NumberHandler.java
    public class NumberHandler implements IHandler { 
    public void handle() {
    System.out.println("Number has been handled");
    }
    }

    • Application.java
    import java.io.*; 

    public class Application {
    public void run() throws Exception {
    System.out.print("Press any key then return: ");
    char c = (char) System.in.read();

    IHandler handler = null;
    if (Character.isLetter(c)) {
    handler = new CharacterHandler();
    }
    else if (Character.isDigit(c)) {
    handler = new NumberHandler();
    }
    else {
    handler = new SymbolHandler();
    }

    handler.handle();
    }

    public static void main(String[] args)
    throws IOException {
    Application app = new Application();
    app.run();
    }
    }

    這是一個(gè)很簡單的程式,可以判定您所輸入的是數(shù)字、字元或是符號(hào),如果將之以物件的方式來組織物件之間的職責(zé),可以將程式改寫如下:
    • Handler.java
    public class Handler { 
    private Handler successor;

    public void setSuccessor(Handler successor) {
    this.successor = successor;
    }

    public Handler getSuccessor() {
    return successor;
    }

    public void handleRequest(char c) {
    if(successor != null)
    successor.handleRequest(c);
    }
    }

    • NumberHandler.java
    public class NumberHandler extends Handler { 
    public void handleRequest(char c) {
    if(Character.isDigit(c)) {
    System.out.println("Number has been handled");
    }
    else {
    getSuccessor().handleRequest(c);
    }
    }
    }

    • CharacterHandler.java
    public class CharacterHandler extends Handler { 
    public void handleRequest(char c) {
    if(Character.isLetter(c)) {
    System.out.println("Character has been handled");
    }
    else {
    getSuccessor().handleRequest(c);
    }
    }
    }

    • SymbolHandler.java
    public class SymbolHandler extends Handler { 
    public void handleRequest(char c) {
    System.out.println("Symbol has been handled");
    }
    }

    • Application.java
    import java.io.*; 

    public class Application {
    public static void main(String[] args)
    throws IOException {
    Handler numberHandler = new NumberHandler();
    Handler characterHandler = new CharacterHandler();
    Handler symbolHandler = new SymbolHandler();

    numberHandler.setSuccessor(characterHandler);
    characterHandler.setSuccessor(symbolHandler);

    System.out.print("Press any key then return: ");
    char c = (char)System.in.read();
    numberHandler.handleRequest(c);
    }
    }

    在組織物件之間的職責(zé)時(shí),通常是從細(xì)粒度至粗粒度的方式來組織,從特殊到抽象化,就像程式中將數(shù)字視為字元的特殊化,字元又為符號(hào)的特殊化。

    Chain of Responsibility的 UML 結(jié)構(gòu)圖如下所示:
    Chain of Responsibility

    從物件執(zhí)行請(qǐng)求的時(shí)間來看,其運(yùn)作是很簡單的職責(zé)傳遞而已,如下:
    Chain of Responsibility

    以上所舉的例子在請(qǐng)求上是很簡單的,只是比對(duì)輸入的型態(tài),在更一般的情況下,可以將請(qǐng)求包裝為一個(gè)物件,並提供getType()之間的方法,以讓 Chain of Responsibility中的物件進(jìn)行比對(duì),例如:
    • Request.java
    public class Request{ 
      private String type;

    public Request(String type) { this.type=type; }
      public String getType() { return type; }

      public void execute(){
    // 執(zhí)行請(qǐng)求
      }
    }

    在Gof的書中所舉的例子為輔助說明系統(tǒng),在一個(gè)介面中希望使用者一定可以得到相關(guān)的說明主題,如果子元件有說明的話,就顯示相關(guān)說明,否則的話就轉(zhuǎn)發(fā)給包括它的容器元件或父元件,以保證使用者的輔助說明請(qǐng)求一定可以得到回應(yīng)。
    posted on 2007-04-17 10:45 張金鵬 閱讀(261) 評(píng)論(0)  編輯  收藏 所屬分類: Behavioral 模式
    主站蜘蛛池模板: 中文字幕在亚洲第一在线| 亚洲人成网站免费播放| 亚洲国产av一区二区三区| 久久综合久久综合亚洲| 999在线视频精品免费播放观看 | 免费A级毛片无码免费视| 77777_亚洲午夜久久多人| 成人网站免费看黄A站视频| 亚洲av无码专区在线电影| 午夜性色一区二区三区免费不卡视频| 亚洲一本综合久久| 91精品导航在线网址免费| 亚洲精品成人久久| 一级毛片a免费播放王色| 亚洲婷婷国产精品电影人久久| 亚洲an日韩专区在线| 国产无人区码卡二卡三卡免费 | 国产成人亚洲综合a∨| 亚洲人成国产精品无码| 四虎亚洲精品高清在线观看| 免费黄色大片网站| 国产亚洲精品美女2020久久| 亚洲一区二区三区国产精品| 成人免费ā片在线观看| 久久久久亚洲AV无码永不| 国产免费毛不卡片| 免费毛片毛片网址| 亚洲av永久无码精品漫画| 无码精品A∨在线观看免费| 亚洲大尺度无码无码专线一区| 亚洲情侣偷拍精品| 99ee6热久久免费精品6| 亚洲码欧美码一区二区三区| 亚洲av无码天堂一区二区三区 | 亚洲成AV人片高潮喷水| 国产亚洲精品影视在线产品| 亚洲一区免费观看| 亚洲AV成人无码网站| 亚洲AV无码成人精品区天堂| 免费可以看黄的视频s色| 日韩在线视频播放免费视频完整版|