设计模式——责任链模式 结构型模型: 创建型模式:
行为型模式(共11种)
其中解释器模式,命令模式,访问者模式 这三个用的比较少,其他模式用的比较多
行为模式中的责任链模式:
一个请求处理:先给第一个对象处理,如果第一个对象处理不了交给第二个对象进行处理,第二个如果处理不了,则交给第三个处理,以此类推。比如说
- 奖学金的审批
- 公司了流程审批
- 接力跑
场景:
这似乎可以用if-else解决,但是如果后续要添加条件的话就需要手动在代码中修改,代码多修改起来容易乱,不利于扩展。而且用if-else的话,代码会非常长。比如添加一个新的链节点
下面看具体案例:
请假条对象
1 package ChainOfResp; 2 3 /** 4 * Created by Administrator on 2018/7/4. 5 */ 6 public class LeaveRequest { 7 private String name; 8 private int daysULeave; 9 private String reason; 10 11 public LeaveRequest(String name, int date, String reason) { 12 this.name = name; 13 this.daysULeave = date; 14 this.reason = reason; 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getDaysULeave() { 26 return daysULeave; 27 } 28 29 public void setDaysULeave(int date) { 30 this.daysULeave = date; 31 } 32 33 public String getReason() { 34 return reason; 35 } 36 37 public void setReason(String reason) { 38 this.reason = reason; 39 } 40 }
抽象领导对象:
1 package ChainOfResp; 2 3 /** 4 * Created by Administrator on 2018/7/4. 5 */ 6 public abstract class Leader { 7 protected String name; 8 protected Leader nextLeader; 9 10 public Leader(String name){ 11 super(); 12 this.name=name; 13 } 14 public void setNextLeader(Leader nextLeader){ 15 this.nextLeader=nextLeader; 16 } 17 protected abstract void handerRequest(LeaveRequest request); 18 }
小领导实例类,继承Leader
package ChainOfResp; /** * 小领导 * Created by Administrator on 2018/7/4. */ public class Director extends Leader{ public Director(String name){ super(name); } @Override public void setNextLeader(Leader nextLeader) { super.setNextLeader(nextLeader); } @Override protected void handerRequest(LeaveRequest request) { if (request.getDaysULeave()<3){ System.out.println("员工"+request.getName()+" "+"请假天数"+request.getDaysULeave()+" 请假理由"+request.getReason()); System.out.println("领导"+this.name+",审批通过!"); }else{ this.nextLeader.handerRequest(request); } } }
然后再创建另外两个继承自Leader的类,之后形成一个链表,代表责任链的关系。
最后写一个测试类
1 package ChainOfResp; 2 3 /** 4 * Created by Administrator on 2018/7/4. 5 */ 6 public class Test { 7 public static void main(String[] args){ 8 Leader a=new Director("zhangsan"); 9 Leader b=new Manager("lisi"); 10 Leader c=new BigManager("wangwu"); 11 12 //组织责任链的关系,形成链表,这里定义的是领导<经理<大经理 13 a.setNextLeader(b); 14 b.setNextLeader(c); 15 LeaveRequest request=new LeaveRequest("wu",5,"gohome"); 16 a.handerRequest(request); 17 18 } 19 }
用责任链的好处:
- 到时候链表的关系我们可以写到配置文件里,而不需要在源文件中用ifelse条件修改。
- 修改链表之间的关系的时候也更加方便,不需要在原来程序的代码(已有的类不需要改动)
- 修改的仅仅是链表的关系,以及新添加一个责任链的节点而已
除了使用链表的方式进行处理,还可以用数组的方式来存储他们之间的关系,也就是用ArrayList来保存责任链(这里就是他们级别的关系)之间的关系。
源码:https://github.com/gowufang/DesignPattern
代理模式
适配模式
桥接模式
组合模式
装饰模式
外观模式
享元模式
创建型模式:
单例
工厂(关注对象的创建)