1 介紹
小白:大哥蟆豫,大學(xué)的報(bào)名費(fèi)是不是很貴哇。
Acey:那得看學(xué)校和個(gè)人了懒闷,一般好些的學(xué)校學(xué)校就相對(duì)來說就能稍微少一些十减。主要還是看個(gè)人咯。
小白:哦愤估?個(gè)人帮辟?
Acey:對(duì)呀,如果你有獎(jiǎng)學(xué)金或者是助學(xué)金玩焰,甚至是貧困證明由驹,你的學(xué)費(fèi)都是可以減免的呢,說到這呀我又想到了一個(gè)模式昔园,叫做職責(zé)鏈模式蔓榄。
職責(zé)鏈模式:職責(zé)鏈模式是行為模式的一種,該模式構(gòu)造了一系列分別擔(dān)當(dāng)不同職責(zé)的類的對(duì)象來完成同一個(gè)任務(wù)默刚,這些不同的對(duì)象像鎖鏈一樣緊密相連甥郑。
小白:額,我聽著咋感覺跟鎖鏈一樣呢荤西,一環(huán)接著一環(huán)澜搅,環(huán)環(huán)相扣伍俘。??
Acey:可以這么理解喲,確實(shí)是一環(huán)接一環(huán)勉躺,只是每一個(gè)環(huán)都可以決定它的下一環(huán)是誰癌瘾,當(dāng)然每一個(gè)環(huán)也都有它獨(dú)有的職責(zé)。就拿報(bào)名費(fèi)來說吧饵溅。去報(bào)名的時(shí)候妨退,收費(fèi)人員會(huì)查看你是否有獎(jiǎng)學(xué)金,然后在查看助學(xué)金概说,最后看貧困證明碧注,這樣一個(gè)鏈下來就是你該付的最終學(xué)費(fèi)了。
小白:soga糖赔,好刺激呀??萍丐。那我得好好學(xué)習(xí),爭(zhēng)取獎(jiǎng)金全拿了放典。
Acey:呃呃逝变,那你好好加油了。,,???,,奋构,下面來實(shí)現(xiàn)這個(gè)功能吧壳影。
2 實(shí)現(xiàn)
首先,先來看下職責(zé)鏈模式的類圖
其中
- Handler:責(zé)任類的抽象父類
- CncreteHandler:具體的責(zé)任類(獎(jiǎng)學(xué)金弥臼、助學(xué)金...)
- Successor:Handler中的方法宴咧,用來設(shè)置當(dāng)前環(huán)的下一環(huán)或獲取下一環(huán)
實(shí)現(xiàn)
第一步:創(chuàng)建處理類的抽象父類
Handler.class
public abstract class Handler {
//下一環(huán)對(duì)象(使用protected,讓子類可以訪問)
protected Handler handler = null;
//設(shè)置當(dāng)前環(huán)的下一環(huán)
public void setSuccessor(Handler handler){
this.handler = handler;
}
//獲取當(dāng)前環(huán)的下一環(huán)
public Handler getSuccessor() {
return handler;
}
//獲取當(dāng)前環(huán)的學(xué)費(fèi)
public abstract Integer getTuition(Student student, Integer tuition);
}
第二步:創(chuàng)建學(xué)生類径缅,存儲(chǔ)學(xué)生獎(jiǎng)金信息
Student.class
public class Student {
private String name;
private Integer Scholarship;//獎(jiǎng)學(xué)金
private Integer grant;//助學(xué)金
private boolean isPoor;//是否貧困
//填充學(xué)生信息
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;
}
}
第三步:創(chuàng)建具體的責(zé)任鏈
Scholarship.class / Grant.class / Poor.class
//獎(jiǎng)學(xué)金處理
public class Scholarship extends Handler{
@Override
public Integer getTuition(Student student, Integer tuition) {
//如果有獎(jiǎng)學(xué)金學(xué)費(fèi)減免
if(student.getScholarship() > 0){
tuition -= student.getScholarship();
System.out.println("獎(jiǎng)學(xué)金減免后學(xué)費(fèi):"+tuition);
//如果有下一環(huán)就傳入下一環(huán)
if(this.getSuccessor() != null){
return this.getSuccessor().getTuition(student, tuition);
}
}
return tuition;
}
}
//助學(xué)金處理
public class Grant extends Handler{
public Integer getTuition(Student student, Integer tuition) {
//如果有助學(xué)金學(xué)費(fèi)減免
if(student.getGrant() > 0){
tuition -= student.getGrant();
System.out.println("助學(xué)金減免后學(xué)費(fèi):"+tuition);
//如果有下一環(huán)就傳入下一環(huán)
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("貧困減免后學(xué)費(fèi):"+tuition);
//如果有下一環(huán)就傳入下一環(huán)
if(this.getSuccessor() != null){
return this.getSuccessor().getTuition(student, tuition);
}
}
return tuition;
}
}
第四步:測(cè)試
MainClass.class
public class MainClass {
public static void main(String[] args) {
//先組裝責(zé)任鏈
Scholarship scholarship = new Scholarship();
Grant grant = new Grant();
Poor poor = new Poor();
scholarship.setSuccessor(grant);
grant.setSuccessor(poor);
//學(xué)生信息
Student xiaobai = new Student("小白", 2000, 1500, true);
Student zifan = new Student("張子凡", 1000, 500, false);
//開始減免學(xué)費(fèi)
System.out.println(xiaobai.getName()+":"+scholarship.getTuition(
xiaobai, 8000));
System.out.println("-------------------------------------");
System.out.println(zifan.getName()+":"+scholarship.getTuition(zifan, 8000));
}
}
我們會(huì)發(fā)現(xiàn),職責(zé)鏈模式的靈活性非常的好纳猪,每個(gè)責(zé)任類只需要處理自己該處理的任務(wù)氧卧,處理完成后就直接交給下一環(huán),而且還可以根據(jù)需求自己設(shè)置當(dāng)前環(huán)的下一環(huán)氏堤。就好比交學(xué)費(fèi)的時(shí)候沙绝,每一位責(zé)任人員只對(duì)一種獎(jiǎng)金處理,這樣就不會(huì)導(dǎo)致因報(bào)名學(xué)生過多導(dǎo)致堵塞現(xiàn)象鼠锈,只需要每一位學(xué)生把所有的環(huán)鏈跑完就可以知道自己最終需要交的學(xué)費(fèi)了闪檬。
喜歡的話戳一下喜歡唄。
有什么建議的話希望大家能在下方回復(fù)??
上一篇:《中介者模式 - 聽說你還是單身dog》
下一篇:《迭代模式 - 報(bào)告老師购笆,我想逃課》