最近学习到设计模式,现总结个人学习备责任链模式内容【注重的是每一个对象对其下个对象的引用】。
上一篇:Java设计模式-备忘录模式
定义
对象由每一个对象对其下家的引用而连接起来形成一条链,即责任链。职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
优缺点
优点
- 简化了对象。使得对象不需要知道链的结构。【链中的每一个节点不需要知道其他节点的内部形态】
- 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 增加新的请求处理类很方便。【链条上添加节点,仅处理自己的逻辑即可】
缺点
- 不能保证请求一定被接收。【每一个节点负责行为,可能一个类的行为出错整个链条崩溃】
- 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
实现
代码
角色:
- 链条节点抽象类:定义了抽象行为,以及定义了存放链的下一个节点的引用【类似指针指向下一个节点】。
- 具体节点:对抽象行为的实现。
/**链条节点的抽象类
* 链的关键记录链的下一个人,以及执行链的行为
* @author cc百川
*/
public abstract class Chain {
Chain nextnode;//存储下一个节点
String nodename;//节点名称
public Chain( String nodename) {
this.nodename = nodename;
}
public Chain setNextNode(Chain nextnode) {
this.nextnode = nextnode;
return this;
}
public abstract void doChain(User user);
}
/** 乡村游医 【假定级别】
* @author cc百川
*/
class VillageDoctor extends Chain{
public VillageDoctor(String appname) {super( appname);}
@Override
public void doChain(User user) {
if(user.grade <= 1) {
System.out.println(this.nodename+"鉴定【"+user.username+"】 体温正常级别无需吃药。");
} else if(user.grade >=2 && user.grade <5) {
System.out.println(this.nodename+"鉴定【"+user.username+"】 属于普通发烧,吃一些处方药即可。");
} else {
nextnode.doChain(user);
}
}
}
/** 名医【假定高于游医】
* @author cc百川
*/
class FamousDoctor extends Chain{
public FamousDoctor(String appname) {super( appname);}
@Override
public void doChain(User user) {
if (user.grade >=5 && user.grade <8) {
System.out.println(this.nodename+"鉴定【"+user.username+"】 属于普通流感,住院治疗即可。");
} else {
nextnode.doChain(user);
}
}
}
/** 宫廷名医【假定高于名医】
* @author cc百川
*/
class CourtDoctor extends Chain{
public CourtDoctor( String appname) {super( appname); }
@Override
public void doChain(User user) {
if (user.grade >=8 && user.grade <=10) {
System.out.println(this.nodename+"鉴定【"+user.username+"】 属于病毒性流感,需要隔离观察。");
} else {
nextnode.doChain(user);
}
}
}
测试
public class Test {
public static void main(String[] args) {
CourtDoctor thosp = new CourtDoctor("宫廷御医云中君");
FamousDoctor shosp = new FamousDoctor("端木蓉名医");
VillageDoctor chosp = new VillageDoctor("道家游医逍遥子");
chosp.setNextNode(shosp);
shosp.setNextNode(thosp);
thosp.setNextNode(chosp);
chosp.doChain(new User("韩非", 2));
chosp.doChain(new User("鬼谷子", 7));
chosp.doChain(new User("雪女", 8));
}
}
责任链模式,重点在于每一个对象对其下个对象的引用,从而仅链式处理。
以上仅为个人学习,如果错误望指出,谢谢。