设计模式-行为型模式-职责链模式

4.1 职责链模式

  1. 模式动机与定义
  • 模式动机

    • 辅导员、系主任、院长、校长都能处理奖学金申请表,他们构成一个处理申请表的链式结构,申请表沿着这条链进行传递,这条链成为职责链
    • 职责链可以是一条直线,一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求
  • 模式定义

    • 职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求。将这些对象连接成一条链,并且沿着这条链传递请求,知道有对象处理它为止
    • 对象行为型模式
  1. 模式结构与分析
  • 模式结构

    • 角色:
      • Handler:抽象处理者
      • ConcreteHandler:具体处理者
  • 模式分析

    • 将请求的处理者组成一条链,并让请求沿着链传递,由链上的处理者对请求进行相应的处理
    • 客户端无须关心请求的处理细节以及请求的的传递,只需将请求发送到链上,将请求的发送者和请求的处理者解耦
  1. 模式实例与解析
  • 模式实例

  • 模式实例

  1. 模式效果与应用
  • 模式优点

    • 使得一个对象无须知道是其他哪一个对象处理其请求,降低了系统的耦合度
    • 可简化对象之间的相互联系
    • 给对象职责的分配带来更多的灵活性
    • 增加一个新的具体请求处理者时无须修改原有系统的代码,只需呀在客户端重新建链即可
  • 模式缺点

    • 不能保证请求一定会被处理
    • 对于比较长的职责链,系统性能将受到一定影响,在进行代码调试时不太方便
    • 如果建链不当,可能会造成循环调用,将导致系统陷入死循环
  • 模式应用场景

    • 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定
    • 在不明确指定接收者的情况下,像多个对象中的一个提交一个请求
    • 可动态指定一组对象处理请求
    • 经典应用: java中的异常处理

class LeaveRequest {
    
    private String leaveName;
    private int leaveDays;
    
    public LeaveRequest(String leaveName,int leaveDays) {
        this.leaveDays = leaveDays;
        this.leaveName = leaveName;
    }

    public String getLeaveName() {
        return leaveName;
    }

    public void setLeaveName(String leaveName) {
        this.leaveName = leaveName;
    }

    public int getLeaveDays() {
        return leaveDays;
    }

    public void setLeaveDay(int leaveDays) {
        this.leaveDays = leaveDays;
    }
    
    

}


abstract class Leader {
    
    protected String name;
    protected Leader leader;
    
    
    
    public Leader(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public Leader getLeader() {
        return leader;
    }

    public void setLeader(Leader leader) {
        this.leader = leader;
    }
    
    public abstract void handleRequest(LeaveRequest leaveRequest);
    

}

class Director extends Leader {
    
    

    public Director(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void handleRequest(LeaveRequest leaveRequest) {
        // TODO Auto-generated method stub
        if(leaveRequest.getLeaveDays()<3) {
            System.out.println("Director " + name + " agree" + leaveRequest.getLeaveName() );
        }
        else {
            if(this.leader!=null) {
                this.leader.handleRequest(leaveRequest);
            }
        }

    }

}


class Manager extends Leader {
    
    public Manager(String name) {
        // TODO Auto-generated constructor stub
        super(name);
    }
    

    @Override
    public void handleRequest(LeaveRequest leaveRequest) {
        // TODO Auto-generated method stub
        if(leaveRequest.getLeaveDays()<10) {
            System.out.println("Manager " + name + " agree" + leaveRequest.getLeaveName() );
        }
        else {
            System.out.println("Manager " + name + " disagree" + leaveRequest.getLeaveName());
        }

    }

}

你可能感兴趣的:(设计模式-行为型模式-职责链模式)