設計模式之-----職責鏈模式

今天來學習職責鏈模式,以下是官方定義:

責任鏈模式是一種對象的行爲模式。在責任鏈模式裏,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。

我們暫且不必管它,熟悉J2EE的人都知道攔截器(Filter),這個filter就可以在一定程度上理解爲職責鏈,所謂的鏈,就是當一條數據出現時,在這個鏈上的對象要處理一遍,如果可以處理,那麼就截獲處理,否則就交給鏈的下一個對象去處理。

舉個例子來說,員工要請假,如果請假半天,跟項目經理說一聲就ok了,但是請假一天的話,你和項目經理一說,項目經理說我處理不了,你找部門經理吧,於是你就找部門經理去請假,假如你要請假7天,這時候部門經理也處理不了了,你就要找總經理了。。。以此類推,這就是個典型的職責鏈模式。

說了這麼多,我們還是看看具體代碼是怎麼實現的吧,我們用一個日常的小例子,就是孩子和爸爸媽媽爺爺要零花錢的例子,爺爺只能給50元以下的零花錢,媽媽能給50-100的零花錢,爸爸能給100以上的零花錢。就用這個例子,我們來看看代碼實現


首先是處理零花錢的一個抽象類

package com.chainresponsibility.handler.abs;

/**
 * 處理小孩要零花錢的抽象類
 * @author ZHENGWEI
 * @date 2015-8-11
 */
public abstract class Handler {

	protected Handler nextHandler = null;

	public Handler getNextHandler() {
		return nextHandler;
	}

	public void setNextHandler(Handler nextHandler) {
		this.nextHandler = nextHandler;
	}
	
	/**
	 * 處理給孩子零花錢的具體方法
	 * @param childName
	 * @param money
	 */
	public abstract void moneyRequest(String childName, double money);
}

之後便是三個職責的具體實現了,中間包含必要的邏輯判斷

package com.chainresponsibility.handler.concrete;

import com.chainresponsibility.handler.abs.Handler;

/**
 * 爺爺處理零花錢的類,爺爺只能處理50元以內的零花錢
 * @author ZHENGWEI
 * @date 2015-8-11
 */
public class GrandFatherHandler extends Handler{

	/**
	 * 爺爺只能處理50元以內的零花錢
	 */
	@Override
	public void moneyRequest(String childName, double money) {
		if(money <= 50){
			//只管自己孫子的零花錢,別人的不管
			if(childName.equals("小明")){
				System.out.println("爺爺給了"+money+"元零花錢");
			} else {
				System.out.println("我不是你的爺爺,不能給你零花錢");
			}
		} else {
			if(this.getNextHandler() != null){
				System.out.println("你要的零花錢太多了,找你的媽媽去吧");
				this.getNextHandler().moneyRequest(childName, money);
			}
		}
	}

}

package com.chainresponsibility.handler.concrete;

import com.chainresponsibility.handler.abs.Handler;

/**
 * 媽媽處理零花錢的類,媽媽只能處理100元以內的零花錢
 * @author ZHENGWEI
 * @date 2015-8-11
 */
public class MotherHandler extends Handler{

	/**
	 * 媽媽只能處理100元以內的零花錢
	 */
	@Override
	public void moneyRequest(String childName, double money) {
		if(money > 50 && money <= 100){
			//只管自己兒子的零花錢,別人的不管
			if(childName.equals("小明")){
				System.out.println("媽媽給了"+money+"元零花錢");
			} else {
				System.out.println("我不是你的媽媽,不能給你零花錢");
			}
		} else {
			if(this.getNextHandler() != null){
				System.out.println("你要的零花錢太多了,找你的爸爸去吧");
				this.getNextHandler().moneyRequest(childName, money);
			}
		}
	}

}

package com.chainresponsibility.handler.concrete;

import com.chainresponsibility.handler.abs.Handler;

/**
 * 爸爸處理零花錢的類,爸爸能處理100元以上的零花錢
 * @author ZHENGWEI
 * @date 2015-8-11
 */
public class FatherHandler extends Handler{

	/**
	 * 爸爸能處理100元以上的零花錢
	 */
	@Override
	public void moneyRequest(String childName, double money) {
		if(money > 100){
			//只管自己兒子的零花錢,別人的不管
			if(childName.equals("小明")){
				System.out.println("爸爸給了"+money+"元零花錢");
			} else {
				System.out.println("我不是你的爸爸,不能給你零花錢");
			}
		}
	}

}

最後是測試類

package com.chainresponsibility.main;

import com.chainresponsibility.handler.abs.Handler;
import com.chainresponsibility.handler.concrete.FatherHandler;
import com.chainresponsibility.handler.concrete.GrandFatherHandler;
import com.chainresponsibility.handler.concrete.MotherHandler;

public class ChainResponsibilityMain {

	public static void main(String[] args) {
		// 聲明職責對象
		Handler grandFatherHandler = new GrandFatherHandler();
		Handler motherHandler = new MotherHandler();
		Handler fatherHandler = new FatherHandler();
		
		// 組裝職責鏈
		grandFatherHandler.setNextHandler(motherHandler);
		motherHandler.setNextHandler(fatherHandler);
		
		// 測試
		grandFatherHandler.moneyRequest("小明", 30);
		System.out.println("1==========");
		grandFatherHandler.moneyRequest("小紅", 30);
		System.out.println("1==========");
		
		grandFatherHandler.moneyRequest("小明", 70);
		System.out.println("2==========");
		grandFatherHandler.moneyRequest("小紅", 70);
		System.out.println("2==========");
		
		grandFatherHandler.moneyRequest("小明", 130);
		System.out.println("3==========");
		grandFatherHandler.moneyRequest("小紅", 130);
		System.out.println("3==========");
	}

}

我們來看看結果,防止大家看混了,我用線分開了


這就是一個簡單的職責鏈模式,數據從鏈中一個一個的進行判斷,直到遇見一個可以處理的爲止。

在我的理解中,職責鏈模式對象的處理原則只有兩個:

1、自己處理

2、自己不能處理,把責任推給下一個對象

如果不滿足這個條件,不能說不是職責鏈模式,至少它不是一個真正的職責鏈模式。不過在真正的項目中,貌似真正的職責鏈模式還是比較少見的,因爲有的時候不可能把所有的情況都預料到,這就需要我們自己進行取捨了。


發佈了78 篇原創文章 · 獲贊 18 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章