責任鏈模式小記【原創】


  中國古代對婦女制定了“三從四德”的道德規范,“三從”是指“未嫁從父、既嫁從夫、夫死從子”,也就是說一個女性,在沒有結婚的時候要聽從於父親,結了婚后聽從於丈夫,丈夫死了還要聽兒子的,舉個例子來說,一個女的要出去逛街,同樣這樣的一個請求,在她沒有出嫁前她必須征得父親的同意,出嫁之后必須獲得丈夫的許可,那丈夫死了怎么辦?一般都是男的比女的死的早,還要問問兒子是否允許自己出去逛街,估計你下邊馬上要問要是沒有兒子怎么辦?

  既然有這么多的問題,那我們要想辦法來解決這些問題,我們可以抽象成這樣一個結構,女性的請求先發送到父親類,父親類一看是自己要處理的,就回應處理,如果女兒已經出嫁了,那就要把這個請求轉發到女婿來處理,那女婿一旦去天國報道了,那就由兒子來處理這個請求,類似於這樣請求:

  父親、丈夫、兒子每個節點有兩個選擇:要么承擔責任,做出回復;要么把請求轉發到后序環節。結構分析的已經很清楚了,那我們看怎么來實現這個功能,先看類圖:

我們使用數字來代表女性的不同狀態,1是未結婚,2是已經結婚的,而且丈夫建在,3是丈夫去世了的

從類圖上看,三個實現類Father、Husband、Son只要實現構造函數和父類的中抽象方法就可以了,具體怎么處理這些請求,都已經轉移到了Hanlder抽象類中,我們來看Hanlder怎么實現:

/**
* 
* 
* 父系社會,那就是男性有至高權利,handler控制權
*/
public abstract class Handler {
//能處理的級別
private int level =0;
//責任傳遞,下一個人責任人是誰
private Handler nextHanlder;
//每個類都要說明一下自己能處理哪些請求
public Handler(int _level){
this.level = _level;
}
//一個女性(女兒,妻子或者是母親)要求逛街,你要處理這個請求
public final void HandleMessage(IWomen women){
if(women.getType() == this.level){
this.response(women);
}else{
if(this.nextHanlder != null){ //有后續環節,才把請求往后遞送
this.nextHanlder.HandleMessage(women);
}else{ //已經沒有后續處理人了,不用處理了
System.out.println("-----------沒地方請示了,不做處理!---------\n");
}
}
}
/*
* 如果你屬於你處理的返回,你應該讓她找下一個環節的人,比如
* 女兒出嫁了,還向父親請示是否可以逛街,那父親就應該告訴女兒,應該找丈夫請示
*/
public void setNext(Handler _handler){
this.nextHanlder = _handler;
}
//有請示那當然要回應
public abstract void response(IWomen women);
}

 

  

  有沒有看到,其實在這里也用到模版方法模式,在模版方法中判斷請求的級別和當前能夠處理的級別,如果相同則調用基本方法,做出反饋;如果不相等,則傳遞到下一個環節,由下一環節做出回應。基本方法response要各個實現類都要實現,我們來看三個實現類:

/**
*
* 父親
*/
public class Father extends Handler {
//父親只處理女兒的請求
public Father(){
super(1);
}
//父親的答復
@Override
public void response(IWomen women) {
System.out.println("--------女兒向父親請示-------");
System.out.println(women.getRequest());
System.out.println("父親的答復是:同意\n");
}
}
/**
*
* 丈夫類
*/
public class Husband extends Handler {
//丈夫只處理妻子的請求
public Husband(){
super(2);
}
//丈夫請示的答復
@Override
public void response(IWomen women) {
System.out.println("--------妻子向丈夫請示-------");
System.out.println(women.getRequest());
System.out.println("丈夫的答復是:同意\n");
}
}
/**
*
* 兒子類
*/
public class Son extends Handler {
//兒子只處理母親的請求
public Son(){
super(3);
}
//兒子的答復
public void response(IWomen women) {
System.out.println("--------母親向兒子請示-------");
System.out.println(women.getRequest());
System.out.println("兒子的答復是:同意\n");
}
}

 

  這三個類都很簡單,構造方法那是你必須實現的,父類已經定義了,子類不實現編譯不通過,通過構造方法我們設置了各個類能處理的請求類型,Father只能處理請求類型為1(也就是女兒)的請求;Husband只能處理請求類型類2(也就是妻子)的請求;兒子只能處理請求類型為3(也就是目前)的請求。
      IWomen接口代碼:

/**
* 
* 古代悲哀女性的總稱
*/
public interface IWomen {
//獲得個人狀況
public int getType();
//獲得個人請示,你要干什么?出去逛街?約會?還是看電影
public String getRequest();
}

 

Woman類:

/**
*
* 古代女性的總稱
*/
public class Women implements IWomen{
/*
* 通過一個int類型的參數來描述婦女的個人狀況
* 1---未出嫁
* 2---出嫁
* 3---夫死
*/
private int type=0;
//婦女的請示
private String request = "";
//構造函數傳遞過來請求
public Women(int _type,String _request){
this.type = _type;
//為了顯示好看點,我在這里做了點處理
switch(this.type){
case 1:
this.request = "女兒的請求是:" + _request;
break;
case 2:
this.request = "妻子的請求是:" + _request;
break;
case 3:
this.request = "母親的請求是:" + _request;
}
}
//獲得自己的狀況
public int getType(){
return this.type;
}
//獲得婦女的請求
public String getRequest(){
return this.request;
}
}

 

我們再來看Client類是怎么描述古代這一個禮節的:

/**
*
* 我們后人來看這樣的社會道德
*/
@SuppressWarnings("all")
public class Client {
public static void main(String[] args) {
//隨機挑選幾個女性
Random rand = new Random();
ArrayList<IWomen> arrayList = new ArrayList();
for(int i=0;i<5;i++){
arrayList.add(new Women(rand.nextInt(4),"我要出去逛街"));
}
//定義三個請示對象
Handler father = new Father();
Handler husband = new Husband();
Handler son = new Son();
//設置請示順序
father.setNext(husband);
husband.setNext(son);
for(IWomen women:arrayList){
father.HandleMessage(women);
}
}
}

 

運行結果如下:

一句話概括責任鏈模式:職責鏈模式:之類的自身迭代,與裝飾相識

再次聲明:這只是我讀《設計模式之禪》之后,怕自己忘記,寫的讀書筆記,拿出來分享,願意看的就一起學習,不願意看的,請繞道就是!
 


免責聲明!

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



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