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》
下一篇:《迭代模式 - 报告老师,我想逃课》