ChainOfResponsibility:職責鏈模式
先代碼
package h.l.demo.chainofresponsibility;
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月7日
* @Description: 職責鏈模式:可以靈活決定下一步執行哪一個實例
*/
public class Chain_Of_Responsibility {
public static void main(String[] args) {
Handler handler3 = new Concretehandler3();
Handler handler2 = new Concretehandler2();
handler2.setHandler(handler3);
Handler handler1 = new Concretehandler1();
handler1.setHandler(handler2);
handler1.handlerRequest(1);
handler1.handlerRequest(13);
handler1.handlerRequest(23);
if(!handler1.handlerRequest(32)){
System.out.println("index值未找到所在的區間");
}
if(!handler1.handlerRequest(-1)){
System.out.println("index值未找到所在的區間");
}
System.out.println("---------------------------------------------");
handler1.setHandler(handler3);
handler1.handlerRequest(1);
if(!handler1.handlerRequest(13)){
System.out.println("index值未找到所在的區間");
}
handler1.handlerRequest(23);
if(!handler1.handlerRequest(32)){
System.out.println("index值未找到所在的區間");
}
if(!handler1.handlerRequest(-1)){
System.out.println("index值未找到所在的區間");
}
}
}
/**
* 處理抽象類
*/
abstract class Handler {
protected Handler handler;
public void setHandler(Handler handler) {
this.handler = handler;
}
/**
*
* @param index
* @return 請求是否被處理
*/
abstract public Boolean handlerRequest(int index);
}
/**
* 具體處理類1
*/
class Concretehandler1 extends Handler {
@Override
public Boolean handlerRequest(int index) {
boolean flag = false;
if(index>=0 && index<=10){
System.out.println("輸入的值在【0-10】之間");
flag = true;
}else if(handler!=null){
flag = handler.handlerRequest(index);
}
return flag;
}
}
/**
* 具體處理類2
*/
class Concretehandler2 extends Handler {
@Override
public Boolean handlerRequest(int index) {
boolean flag = false;
if(index>=11 && index<=20){
System.out.println("輸入的值在【11-20】之間");
flag = true;
}else if(handler!=null){
flag = handler.handlerRequest(index);
}
return flag;
}
}
/**
* 具體處理類3
*/
class Concretehandler3 extends Handler {
@Override
public Boolean handlerRequest(int index) {
boolean flag = false;
if(index>=21 && index<=30){
System.out.println("輸入的值在【21-30】之間");
flag = true;
}else if(handler!=null){
flag = handler.handlerRequest(index);
}
return flag;
}
}
測試結果:
後分析
- 個人建議:寫代碼是件幸福的事,So,do it
職責鏈模式,定義:使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這個對象連接成一條鏈,並沿着這條鏈傳遞該請求,知道有一個對象處理它爲止。
職責鏈的好處:當客戶提交一個請求時,請求時沿鏈傳遞直至有一個ConcreteHandler對象負責處理它。
分析上面的demo,可以發現的是每一個具體類中的處理,當不符合if情況時,都會在else分支中指向後續節點處理,這個後續節點由客戶端設置,是動態的,具有高度的靈活性,也就是說一個請求的處理通過客戶端的不同設置可以使得處理鏈長度不一,執行順序不一,隨客戶端改變而改變。
其他例子:參考自《大話設計模式》加薪申請。得一級級申請,直到某一級同意。
注:以上文章僅是個人總結,若有不當之處,望不吝賜教