1. 程式人生 > >【Java設計模式】· 職責鏈模式(Chain of Responsibility)

【Java設計模式】· 職責鏈模式(Chain of Responsibility)

職責鏈模式:

1.覺得學過的東西如果不記下來就太浪費了,還會經常忘掉,於是乎開始寫部落格。我只是一個菜鳥程式設計師,但有一顆嚮往技術大牛的心。

2.職責鏈模式:當一個問題需要經過“重重考慮”才能給出結果時,這樣的“重重考慮”的過程,需要用到職責鏈模式。職責鏈模式中,有多個負責不同職責的handler,當handlerA解決不了問題時,會交給handlerB,而如果handlerB也不能解決時,就會交給handlerC····以此類推,直到最後一個handler。

Handler : 責任人的父類

ConcreteHandler:責任人的具體類

3.例子: 學生要向學校請假,如果請假天數<3天,只需要老師批准,而3天<請假天數<7天則需要級長批准,7天以上的請假需要校長批准,這時候需要用到職責鏈模式。

首先新建一個Handler類,所有處理問題的人都是Handler的子類

package pers.reus.model.handler.impl;

public abstract class Handler {
	//建立職責鏈的連線者
	protected Handler successor = null;
	
	//設定下一個處理的物件
	public void setSuccessor(Handler successor){
		this.successor = successor;
	}
	
	//獲得下一個處理物件
	public Handler getSuccessor(){
		return successor;
	}
	
	/**
	 * 處理學生請假的方法
	 * student 學生姓名
	 * day     請假天數
	 * **/
	public abstract String HandlerRequest(String student, int day);
}


接下來分別建立 教師,級長,校長 三種責任人,他們都繼承Handler

教師:

package pers.reus.model.handler;

import pers.reus.model.handler.impl.Handler;

public class Teacher extends Handler {
	public String HandlerRequest(String student, int day){
		//處理請假結果以String返回
		String msg = null;
		
		//請假少於3天,只需老師同意
		if(day <= 3){
			msg = "老師同意 " + student + " 請假 " + day + " 天";
		}else{
			//當存在下一個處理物件時,老師處理不了的請假交由下一個物件處理
			if(getSuccessor() != null){  
				System.out.println("老師無權同意 " + student + " 請假 " + day + " 天");
				return getSuccessor().HandlerRequest(student,day);
			}
		}
		//返回請假結果
		return msg;
	}
	
}


級長:
package pers.reus.model.handler;

import pers.reus.model.handler.impl.Handler;

public class Prefect extends Handler{

	public String HandlerRequest(String student, int day) {
		//處理請假結果以String返回
		String msg = null;
		
		//請假少於7天,只需級長同意
		if(day <= 7){
			msg = "級長同意 " + student + " 請假 " + day + " 天";
		}else{
			//當存在下一個處理物件時,級長處理不了的請假交由下一個物件處理
			if(getSuccessor() != null){
				System.out.println("級長無權同意 " + student + " 請假 " + day + " 天");
				return getSuccessor().HandlerRequest(student,day);
			}
		}
		//返回請假結果
		return msg;
	}

}

校長:

package pers.reus.model.handler;

import pers.reus.model.handler.impl.Handler;

public class SchoolMaster extends Handler{

	public String HandlerRequest(String student, int day) {
		//處理請假結果以String返回
		String msg = null;
		
		//請假大於7天,需要校長同意
		if(day > 7){
			msg = "校長同意 " + student + " 請假 " + day + " 天";
		}else{
			//當存在下一個處理物件時,校長處理不了的請假交由下一個物件處理
			if(getSuccessor() != null){
				System.out.println("校長無權同意 " + student + " 請假 " + day + " 天");
				return getSuccessor().HandlerRequest(student,day);
			}
		}
		//返回請假結果
		return msg;
	}
	
}

最後,建立client類測試:

package pers.reus.model.client;

import pers.reus.model.handler.Prefect;
import pers.reus.model.handler.SchoolMaster;
import pers.reus.model.handler.Teacher;
import pers.reus.model.handler.impl.Handler;

public class Client {

	public static void main(String[] args) {
		//建立 教師,級長,校長 三個類
		Handler teacher = new Teacher();  
        Handler prefect = new Prefect();  
        Handler schoolMaster = new SchoolMaster();  
        
        //設定責任關係,教師無法處理交給級長,級長無法處理交給校長
        teacher.setSuccessor(prefect);  
        prefect.setSuccessor(schoolMaster);
        
        //模擬學生進行請假
        String str = teacher.HandlerRequest("小明",8);
        
        //輸出請假結果
        System.out.println(str);
	}

}


相關推薦

JAVA設計模式職責模式

一、定義 職責鏈模式使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。 如類圖所示,當客戶提交一個請求時,請求時沿鏈傳遞直至有一個ConcreteHandler物件負責處理它。接收者和傳送者都沒

Java設計模式· 職責模式Chain of Responsibility

職責鏈模式: 1.覺得學過的東西如果不記下來就太浪費了,還會經常忘掉,於是乎開始寫部落格。我只是一個菜鳥程式設計師,但有一顆嚮往技術大牛的心。 2.職責鏈模式:當一個問題需要經過“重重考慮”才能給

PHP-設計模式職責模式

author:咔咔 WeChat:fangkangfk   什麼是職責鏈模式: 職責鏈模式是包含了一些命令物件和一些處理物件,每個處理物件決定他能處理的那些命令物件,它也知道把自己不能處理的命令物件移交給下一個處理物件   白話解釋: 這個案例一共三個

設計模式——職責模式Chain Responsibility

行為型模式——職責鏈模式(Chain Responsibility)定義: 使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,知道有一

Java設計模式職責模式Chain of Responsibility

目錄 目的 應用例項 程式碼    目的 避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將他們連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理為止。 應用例項 職責鏈上的處理者負責處理請求,

設計模式的征途—14.職責Chain of Responsibility模式

and 問題 調試 決定 tor 客戶端 edi toa 發送 相信大家都玩過類似於“鬥地主”的紙牌遊戲,某人出牌給他的下家,下家看看手中的牌,如果要不起,則將出牌請求轉發給他的下家,其下家再進行判斷。一個循環下來,如果其他人都要不起該牌,則最初的出

淺談Java設計模式十七責任模式Chain of Responsibility

前言: 接下來我們將要談談責任鏈模式,有多個物件,每個物件持有對下一個物件的引用,這樣就會形成一條鏈,請求在這條鏈上傳遞,直到某一物件決定處理該請求。但是發出者並不清楚到底最終那個物件會處理該請求,所

設計模式職責模式Chain Of Responsibility

1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 //管理者類 7 class Manager 8 { 9 private: 10 stri

設計模式(行為型模式) ----- 責任模式Chain of Responsibility

有多個物件,每個物件持有對下一個物件的引用,這樣就會形成一條鏈,請求在這條鏈上傳遞,直到某一物件決定處理該請求。但是發出者並不清楚到底最終那個物件會處理該請求,所以,責任鏈模式可以實現,在隱瞞客戶端的情況下,對系統進行動態的調整。先看看關係圖: Abstr

設計模式——責任Chain of Responsibility

責任鏈模式 為 設計模式的 行為型模式的一種. #責任鏈最常見的舉例是 申請費用: 程式猿 申請出差費用 (由於各位領導的審批額度有限,需要逐層審批):小組長—>專案經理—>部門經理—>Boss(小組長髮現額度過大,小組長向專案

設計模式:責任模式Chain of Responsibility

 使多個物件都有機會處理請求,從而避免請求的傳送者和接受者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,知道有一個物件處理它為止。 責任鏈模式的角色: 1. 抽象處理者角色(Handler):定義出一個處理請求的介面。如果需要,介面可以定

責任模式chain of responsibility

機制 request chain pro over 過濾 攔截器 asc servlet開發 責任鏈模式定義:   將能夠處理同一類請求的對象連成一條鏈,所提及的請求沿著鏈傳遞,鏈上的對象逐個判斷是否有能力處理該請求,如果能則處理,如果不能則傳遞給鏈上的下一個對象。

java面試題Static Nested Class巢狀類 和 Inner Class內部類的不同 、final、static

前言: 本來是想總結一下inner class 的用法,但是卻發現這幾位頗為親近。索性一起拉出來溜溜。 寫作目的: 跟 static , final, inner class 搞好關係,以便將來遇見了,就像用if ,else一樣,一清二楚。 文中的術語定義以java language spec為準。 先想想

10.責任模式Chain of Responsibility

1.定義: 使多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。 責任鏈模式是一種物件的行為模式。 2.通用程式碼 這個模式很簡單,也許看完通用程式碼就能理解了: package _1

java設計模式之 責任chain of resposibility模式

  責任鏈模式,顧名思義,就是一條鏈。這個鏈到底是怎麼執行的呢?它主要是將能夠處理同一類請求的物件連成一條鏈,所提交的請求沿著鏈傳遞,鏈上的物件逐個判斷是否有能力處理該請求,如果能則處理,如果不能則

設計模式責任模式

receive req evel 自己 缺點 結果 改革 == 引用 1、定義 1.1 標準定義 Avoid coupling the sender of a request to its receiver by giving more than one object a

C++設計模式責任模式

#ifndef __CHAIN_H__ #define __CHAIN_H__ #include <iostream> #include <string> //責任鏈模式:為

設計模式——責任模式

【責任鏈模式】 責任鏈模式(Chain of Responsibility):使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係,將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理他為止 【介紹】 主要解決:職責鏈上的處

Java設計模式之責任模式職責模式

什麼是鏈1、鏈是一系列節點的集合。2.、鏈的各節點可靈活拆分再重組。職責鏈模式使多個物件都有機會處理請求,從而避免請求的傳送者和接受者之間的耦合關係,將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理他為止。角色抽象處理者角色(Handler):定義出一個處理請

JS設計模式責任模式的程式碼示例

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