1. 程式人生 > >淺談JAVA設計模式之——責任鏈模式(COR)

淺談JAVA設計模式之——責任鏈模式(COR)

一、概述

使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈, 並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。 這一模式的想法是,給多個物件處理一個請求的機會,從而解耦傳送者和接受者.

二、適用性

1.有多個的物件可以處理一個請求,哪個物件處理該請求執行時刻自動確定。

2.你想在不明確指定接收者的情況下,向多個物件中的一個提交一個請求。

3.可處理一個請求的物件集合應被動態指定。

三、參與者

1.Handler 定義一個處理請求的介面。 (可選)實現後繼鏈。

2.ConcreteHandler 處理它所負責的請求。 可訪問它的後繼者。 如果可處理該請求,就處理之;否則將該請求轉發給它的後繼者。

3.Client 向鏈上的具體處理者(ConcreteHandler)物件提交請求。

四、類圖

五、示例

Handler

package com.lyz.design.cor;

import org.omg.CORBA.Request;

/**
 * Handler
 * @author liuyazhuang
 *
 */
public interface RequestHandle {
    void handleRequest(Request request);
}
ConcreteHandler
package com.lyz.design.cor;

import org.omg.CORBA.Request;

/**
 * ConcreteHandler 
 * @author liuyazhuang
 *
 */
public class HRRequestHandle implements RequestHandle {

    public void handleRequest(Request request) {
        if (request instanceof DimissionRequest) {
            System.out.println("要離職, 人事審批!");
        } 

        System.out.println("請求完畢");
    }
}

package com.lyz.design.cor;
/**
 * ConcreteHandler
 * @author liuyazhuang
 *
 */
public class PMRequestHandle implements RequestHandle {

    RequestHandle rh;
    
    public PMRequestHandle(RequestHandle rh) {
        this.rh = rh;
    }
    
    public void handleRequest(Request request) {
        if (request instanceof AddMoneyRequest) {
            System.out.println("要加薪, 專案經理審批!");
        } else {
            rh.handleRequest(request);
        }
    }
}

package com.lyz.design.cor;
/**
 * ConcreteHandler
 * @author liuyazhuang
 *
 */
public class TLRequestHandle implements RequestHandle {
    RequestHandle rh;
    public TLRequestHandle(RequestHandle rh) {
        this.rh = rh;
    }

    public void handleRequest(Request request) {
        if (request instanceof LeaveRequest) {
            System.out.println("要請假, 專案組長審批!");
        } else {
            rh.handleRequest(request);
        }
    }
}

Test
package com.lyz.design.cor;

import org.omg.CORBA.Request;

/**
 * Test
 * @author liuyazhuang
 *
 */
public class Test {

    public static void main(String[] args) {
        RequestHandle hr = new HRRequestHandle();
        RequestHandle pm = new PMRequestHandle(hr);
        RequestHandle tl = new TLRequestHandle(pm);
        
        //team leader處理離職請求
        Request request = new Request();
        tl.handleRequest(request);
        
        System.out.println("===========");
        //team leader處理加薪請求
        request = new AddMoneyRequest();
        tl.handleRequest(request);
        
        System.out.println("========");
        //專案經理上理辭職請求
        request = new DimissionRequest();
        pm.handleRequest(request);
    }
}

Result
要離職, 人事審批!
請求完畢
===========
要加薪, 專案經理審批!
========
要離職, 人事審批!
請求完畢