中國古代對婦女制定了“三從四德”的道德規范,“三從”是指“未嫁從父、既嫁從夫、夫死從子”,也就是說一個女性,在沒有結婚的時候要聽從於父親,結了婚后聽從於丈夫,丈夫死了還要聽兒子的,舉個例子來說,一個女的要出去逛街,同樣這樣的一個請求,在她沒有出嫁前她必須征得父親的同意,出嫁之后必須獲得丈夫的許可,那丈夫死了怎么辦?一般都是男的比女的死的早,還要問問兒子是否允許自己出去逛街,估計你下邊馬上要問要是沒有兒子怎么辦?
既然有這么多的問題,那我們要想辦法來解決這些問題,我們可以抽象成這樣一個結構,女性的請求先發送到父親類,父親類一看是自己要處理的,就回應處理,如果女兒已經出嫁了,那就要把這個請求轉發到女婿來處理,那女婿一旦去天國報道了,那就由兒子來處理這個請求,類似於這樣請求:
父親、丈夫、兒子每個節點有兩個選擇:要么承擔責任,做出回復;要么把請求轉發到后序環節。結構分析的已經很清楚了,那我們看怎么來實現這個功能,先看類圖:
我們使用數字來代表女性的不同狀態,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); } } }
運行結果如下:
一句話概括責任鏈模式:職責鏈模式:之類的自身迭代,與裝飾相識
再次聲明:這只是我讀《設計模式之禪》之后,怕自己忘記,寫的讀書筆記,拿出來分享,願意看的就一起學習,不願意看的,請繞道就是!