【設計模式】責任鏈模式


使用頻率:★★★☆☆

一、什么是責任鏈模式

為請求創建了一個接收者對象的鏈,每個接收者都包含對另一個接收者的引用,當某個接受者不能處理該請求時,會將該請求轉給下一個接受者處理;

二、補充說明

請求發送者與請求接受者解耦

應用例子:struts的攔截器,servlet的過濾器

三、角色

抽象請求處理者

具體請求處理者:包含下一個具體請求處理者的引用

客戶端:請求發送者

四、例子,JAVA實現

說明:模擬一個村、鎮、縣的責任鏈關系請求

抽象處理者

package com.pichen.dp.behavioralpattern.chain;

public abstract class Handler {

    protected Handler next;

    public abstract void handleRequest(String value);

    public Handler next() {
        return this.next;
    }

    public void setNext(Handler next) {
        this.next = next;
    }
}

具體村、鎮、縣處理者

package com.pichen.dp.behavioralpattern.chain;

public class VillageHandler extends Handler {

    /**
     * @see com.pichen.dp.behavioralpattern.chain.Handler#handleRequest()
     */
    @Override
    public void handleRequest(String value) {
        if ("village".equals(value)) {
            System.out.println("VillageHandler: handled~");
        } else {
            System.out.println("VillageHandler: pass~");
            this.next.handleRequest(value);
        }
    }

}
package com.pichen.dp.behavioralpattern.chain;

public class TownHandler extends Handler {

    @Override
    public void handleRequest(String value) {
        if ("town".equals(value)) {
            System.out.println("VillageHandler: handled~");
        } else {
            System.out.println("Town: pass~");
            this.next.handleRequest(value);
        }
    }
}
package com.pichen.dp.behavioralpattern.chain;

public class CountyHandler extends Handler {

    @Override
    public void handleRequest(String value) {
        if ("county".equals(value)) {
            System.out.println("County: handled~");
        } else if (this.next == null) {
            System.out
                    .println("no next Handler, this request can not be handle~");
        } else {
            System.out.println("County: pass~");
            this.next.handleRequest(value);
        }
    }
}

客戶端:

package com.pichen.dp.behavioralpattern.chain;

public class Main {

    public static void main(String[] args) {
        Handler villageHandler = new VillageHandler();
        Handler townHandler = new TownHandler();
        Handler countyHandler = new CountyHandler();
        
        villageHandler.setNext(townHandler);
        townHandler.setNext(countyHandler);
        
        System.out.println("test county request:");
        villageHandler.handleRequest("county");
        
        System.out.println("\ntest city request:");
        villageHandler.handleRequest("city");
    }
}

結果:

test county request:
VillageHandler: pass~
Town: pass~
County: handled~

test city request:
VillageHandler: pass~
Town: pass~
no next Handler, this request can not be handle~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM