職責鏈模式 - 為什么你的學費比別人貴?

1 介紹


小白:大哥,大學的報名費是不是很貴哇。

Acey:那得看學校和個人了,一般好些的學校學校就相對來說就能稍微少一些。主要還是看個人咯。

小白:哦?個人?

Acey:對呀,如果你有獎學金或者是助學金,甚至是貧困證明,你的學費都是可以減免的呢,說到這呀我又想到了一個模式,叫做職責鏈模式

職責鏈模式:職責鏈模式是行為模式的一種,該模式構造了一系列分別擔當不同職責的類的對象來完成同一個任務,這些不同的對象像鎖鏈一樣緊密相連。

小白:額,我聽著咋感覺跟鎖鏈一樣呢,一環接著一環,環環相扣。??

Acey:可以這么理解喲,確實是一環接一環,只是每一個環都可以決定它的下一環是誰,當然每一個環也都有它獨有的職責。就拿報名費來說吧。去報名的時候,收費人員會查看你是否有獎學金,然后在查看助學金,最后看貧困證明,這樣一個下來就是你該付的最終學費了。

小白:soga,好刺激呀??。那我得好好學習,爭取獎金全拿了。

Acey:呃呃,那你好好加油了。,,???,,,下面來實現這個功能吧。

2 實現


首先,先來看下職責鏈模式的類圖

類圖

其中

  • Handler:責任類的抽象父類
  • CncreteHandler:具體的責任類(獎學金、助學金...)
  • Successor:Handler中的方法,用來設置當前環的下一環或獲取下一環

實現

一步:創建處理類的抽象父類

Handler.class

public abstract class Handler {
    //下一環對象(使用protected,讓子類可以訪問)
    protected Handler handler = null;
    
    //設置當前環的下一環
    public void setSuccessor(Handler handler){
        this.handler = handler;
    }
    
    //獲取當前環的下一環
    public Handler getSuccessor() {
        return handler;
    }
    
    //獲取當前環的學費
    public abstract Integer getTuition(Student student, Integer tuition);

}

二步:創建學生類,存儲學生獎金信息

Student.class

public class Student {
    private String name;
    private Integer Scholarship;//獎學金 
    private Integer grant;//助學金
    private boolean isPoor;//是否貧困
    
    //填充學生信息
    public Student(String name, Integer scholarship, Integer grant,
            boolean isPoor) {
        super();
        this.name = name;
        Scholarship = scholarship;
        this.grant = grant;
        this.isPoor = isPoor;
    }
    
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getScholarship() {
        return Scholarship;
    }
    public void setScholarship(Integer scholarship) {
        Scholarship = scholarship;
    }
    public Integer getGrant() {
        return grant;
    }
    public void setGrant(Integer grant) {
        this.grant = grant;
    }
    public boolean isPoor() {
        return isPoor;
    }
    public void setPoor(boolean isPoor) {
        this.isPoor = isPoor;
    }
    
    
}

三步:創建具體的責任鏈

Scholarship.class / Grant.class / Poor.class

//獎學金處理
public class Scholarship extends Handler{
    @Override
    public Integer getTuition(Student student, Integer tuition) {
        //如果有獎學金學費減免
        if(student.getScholarship() > 0){
            tuition -= student.getScholarship();
            System.out.println("獎學金減免后學費:"+tuition);
            //如果有下一環就傳入下一環
            if(this.getSuccessor() != null){
                return  this.getSuccessor().getTuition(student, tuition);
            }
        }
        return tuition;
    }

}
//助學金處理
public class Grant extends Handler{

    public Integer getTuition(Student student, Integer tuition) {
        //如果有助學金學費減免
        if(student.getGrant() > 0){
            tuition -= student.getGrant();
            System.out.println("助學金減免后學費:"+tuition);
            //如果有下一環就傳入下一環
            if(this.getSuccessor() != null){
                return  this.getSuccessor().getTuition(student, tuition);
            }
        }
        return tuition;
    }
}
//貧困處理
public class Poor extends Handler{

    public Integer getTuition(Student student, Integer tuition) {
        //如果貧困,減免1000
        if(student.isPoor()){
            tuition -= 1000;
            System.out.println("貧困減免后學費:"+tuition);
            //如果有下一環就傳入下一環
            if(this.getSuccessor() != null){
                return  this.getSuccessor().getTuition(student, tuition);
            }
        }
        return tuition;
    }

}

四步:測試

MainClass.class

public class MainClass {
    public static void main(String[] args) {
        //先組裝責任鏈
        Scholarship scholarship = new Scholarship();
        Grant grant = new Grant();
        Poor poor = new Poor();
        
        scholarship.setSuccessor(grant);
        grant.setSuccessor(poor);
        
        //學生信息
        Student xiaobai = new Student("小白", 2000, 1500, true);
        Student zifan = new Student("張子凡", 1000, 500, false);
        
        //開始減免學費
        System.out.println(xiaobai.getName()+":"+scholarship.getTuition(
          xiaobai, 8000));
        System.out.println("-------------------------------------");
        System.out.println(zifan.getName()+":"+scholarship.getTuition(zifan, 8000));
    }
}

運行結果

我們會發現,職責鏈模式的靈活性非常的好,每個責任類只需要處理自己該處理的任務,處理完成后就直接交給下一環,而且還可以根據需求自己設置當前環的下一環。就好比交學費的時候,每一位責任人員只對一種獎金處理,這樣就不會導致因報名學生過多導致堵塞現象,只需要每一位學生把所有的環鏈跑完就可以知道自己最終需要交的學費了。

喜歡的話戳一下喜歡唄。
有什么建議的話希望大家能在下方回復??
上一篇:《中介者模式 - 聽說你還是單身dog》
下一篇:《迭代模式 - 報告老師,我想逃課》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容