设计模式——责任链模式 结构型模型: 创建型模式:

行为型模式(共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


代理模式

适配模式

桥接模式

组合模式

装饰模式

外观模式

享元模式

创建型模式:

单例

工厂(关注对象的创建)