GOF23设计模式之责任链模式(chain of responsibility)之实现


/**
 * 请假条
 * 封装请假的信息。
 */
package com.bjsxt.cn.chainOfResponsibility;
public class LeaveRequest {
 private String empName;
 private int leaveDays;
 private String reasons;
 
 public LeaveRequest(String empName, int leaveDays, String reasons) {
  super();
  this.empName = empName;
  this.leaveDays = leaveDays;
  this.reasons = reasons;
 }
 public String getEmpName() {
  return empName;
 }
 public void setEmpName(String empName) {
  this.empName = empName;
 }
 public int getLeaveDays() {
  return leaveDays;
 }
 public void setLeaveDays(int leaveDays) {
  this.leaveDays = leaveDays;
 }
 public String getReasons() {
  return reasons;
 }
 public void setReasons(String reasons) {
  this.reasons = reasons;
 }
 @Override
 public String toString() {
  
  return "雇员:" + empName + "请假,天数:" + leaveDays + ",请假理由:" + reasons;
 }
}




/**
 * 抽象类Leader,在请假的流程之中,把审批人员
 * 主任,经理,总经理,抽象成一个类,他们
 * 具有相同的功能,审批。handleRequest
 * 2015年4月9日14:40:49
 *
 */
package com.bjsxt.cn.chainOfResponsibility;
public abstract class Leader {
 protected String name;
 protected Leader nextLeader;
 
 public Leader(String name) {
  super();
  this.name = name;
 }
 public void setNextLeader(Leader nextLeader) {
  this.nextLeader = nextLeader;
 }
 
 public abstract void handleRequest(LeaveRequest request);
 public abstract String check();
}




/**
 * 主任类:
 *  如果请假天数小于3天,主任审批
 * 2015年4月9日14:43:36
 */
package com.bjsxt.cn.chainOfResponsibility;
public class Director extends Leader {
 public Director(String name) {
  super(name);
 }
 @Override
 public void handleRequest(LeaveRequest request) {
  if (request.getLeaveDays() < 3) {
   System.out.println("雇员名字:" + request.getEmpName() +"请假,天数为:" + request.getLeaveDays() +"请假原因为" +request.getReasons());
   System.out.println(check());
  } else {
   if (this.nextLeader != null) {
    this.nextLeader.handleRequest(request);
   }
  }
 }
 @Override
 public String check() {
  return "主任:" + name + "审批通过!";
  
 }
 
 
}




/**
 * 时间:2015年4月9日14:48:13
 * 经理类: 如果请假条数大于等于3天,小于十天,经理审批
 */
package com.bjsxt.cn.chainOfResponsibility;
public class Manager extends Leader {
 
 public Manager(String name) {
  super(name);
 }
 
 @Override
 public void handleRequest(LeaveRequest request) {
  if (request.getLeaveDays() <10) {
   System.out.println(request.toString());
   System.out.println(check());
  } else {
   if (this.nextLeader != null) {
    this.nextLeader.handleRequest(request);
   }
  }
 }
 @Override
 public String check() {
  return "经理:" + name + "审批通过";
 }
}




/**
 * 总经理: 如果大于等于十天,小于三十天,总经理审批
 * 时间:2015年4月9日14:53:41
 */
package com.bjsxt.cn.chainOfResponsibility;
public class GeneralManager extends Leader {
 public GeneralManager(String name) {
  super(name);
 }
 
 
 @Override
 public void handleRequest(LeaveRequest request) {
  if (request.getLeaveDays() < 30) {
   System.out.println(request.toString());
   System.out.println(check());
  } else {
   System.out.println(request.toString() + "莫非想辞职,不批准");
  }
 }
 @Override
 public String check() {
  return "总经理 :" + name +"审核通过";
 }
}


/**
 * 2015年4月9日14:59:50
 * 测试程序:测试责任链模式的使用
 * 我们使用责任链模式而不是非常繁冗复杂的ifelse结构,是为了扩展时的方便。
 * 例如,此时,我们如果想要加入一位副总经理,来处理10到20天的假条审核
 * 我们只需要加入新的类ViceGeneralManager,在客户程序中创建新的责任链即可。
 * 这样符合OCP原则,即开闭原则。
 */
package com.bjsxt.cn.chainOfResponsibility;
public class Client {
 public static void main(String[] args) {
  LeaveRequest l1 = new LeaveRequest("杰伦", 1, "旅游");
  LeaveRequest l2 = new LeaveRequest("张靓颖", 8, "恋爱");
  LeaveRequest l3 = new LeaveRequest("夏洛蒂", 15, "失恋了");
  LeaveRequest l4 = new LeaveRequest("巴赫", 37, "在家带孩子");
  
  Leader ll1 = new Director("张主任");
  Leader ll2 = new Manager("李经理");
  Leader ll3 = new GeneralManager("王总经理");
  //创建责任链
  ll1.setNextLeader(ll2);
  ll2.setNextLeader(ll3);
  
  ll1.handleRequest(l1);
  ll1.handleRequest(l2);
  ll1.handleRequest(l3);
  ll1.handleRequest(l4);
  
 }
}
/*
雇员名字:杰伦请假,天数为:1请假原因为旅游
主任:张主任审批通过!
雇员:张靓颖请假,天数:8,请假理由:恋爱
经理:李经理审批通过
雇员:夏洛蒂请假,天数:15,请假理由:失恋了
总经理 :王总经理审核通过
雇员:巴赫请假,天数:37,请假理由:在家带孩子莫非想辞职,不批准
 *
 *
 */



/**
 * 加入副总经理处理十天到二十天的假条审核
 * 2015年4月9日15:12:46
 */
package com.bjsxt.cn.chainOfResponsibility;
public class ViceGeneralManager extends Leader{
 public ViceGeneralManager(String name) {
  super(name);
 }
 @Override
 public void handleRequest(LeaveRequest request) {
  if (request.getLeaveDays() < 20) {
   System.out.println(request.toString());
   System.out.println(check());
  } else {
   if (this.nextLeader != null) {
    this.nextLeader.handleRequest(request);
   }
  }
 }
 @Override
 public String check() {
  return "副总经理:" + name + "审核通过";
 }
}



/**
 * 增加ViceGeneralManager类之后稍作调整就可以加入加入该类之后的新的责任链。
 */
package com.bjsxt.cn.chainOfResponsibility;
public class Client2 {
 public static void main(String[] args) {
  LeaveRequest l1 = new LeaveRequest("杰伦", 1, "旅游");
  LeaveRequest l2 = new LeaveRequest("张靓颖", 8, "恋爱");
  LeaveRequest l3 = new LeaveRequest("夏洛蒂", 15, "失恋了");
  LeaveRequest l4 = new LeaveRequest("巴赫", 37, "在家带孩子");
  
  Leader ll1 = new Director("张主任");
  Leader ll2 = new Manager("李经理");
  Leader ll22 = new ViceGeneralManager("王副总经理");
  Leader ll3 = new GeneralManager("王总经理");
  
  //创建责任链
  ll1.setNextLeader(ll2);
  ll2.setNextLeader(ll22);
  ll22.setNextLeader(ll3);
  
  ll1.handleRequest(l1);
  ll1.handleRequest(l2);
  ll1.handleRequest(l3);
  ll1.handleRequest(l4);
  
 }
}
/*
 *
雇员名字:杰伦请假,天数为:1请假原因为旅游
主任:张主任审批通过!
雇员:张靓颖请假,天数:8,请假理由:恋爱
经理:李经理审批通过
雇员:夏洛蒂请假,天数:15,请假理由:失恋了
副总经理:王副总经理审核通过
雇员:巴赫请假,天数:37,请假理由:在家带孩子莫非想辞职,不批准
 *
 * */




时间: 2024-08-11 22:40:09

GOF23设计模式之责任链模式(chain of responsibility)之实现的相关文章

设计模式 笔记 责任链模式 chain of responsibility

//---------------------------15/04/25---------------------------- //Chain of responsibility 责任链-----对象行为型模式 /* 1:意图: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象 连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 2:动机: 3:适用性: 1>有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 2>你想在不明确指定

GOF23设计模式之责任链模式(chain of responsibility)与结构型模式总结经典

 责任链模式:Chain of responsibility      将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象. 场景:      打牌时,轮流出牌.      接力赛跑      大学中,奖学金审批.      公司中,公文审批.   结构型模式汇总: 代理模式:为真实对象提供一个代理,从而控制对真实对象的访问. 适配器模式:使原本由于接口不兼容不能一起工作的类,可以一起工作. 桥

[设计模式-行为型]责任链模式(Chain of Responsibility)

概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 解析 形象比喻: 晚上去上英语课, 为了好开溜坐到了最后一排, 哇, 前面坐了好几个漂亮的MM 哎

责任链模式-Chain of Responsibility(Java实现), 例1

责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. Trouble类 本类是:待责任链来处理的问题Trouble类. 本例子较简单, Trouble只有一个int型作为待处理的编号. public class Trouble { private int number; public Trouble(int number) { this.number

【GOF23设计模式】责任链模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 1 package com.test.chainOfResp; 2 /** 3 * 封装请假的基本信息 4 */ 5 public class LeaveRequest { 6 private String empName; 7 private int leaveDays; 8 private String reason; 9 10 publi

设计模式之二十:责任链模式(Chain of Responsibility)

感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有机会来处理请求的方式避免了请求的发送者和接收者之间的耦合.将接收者组织成链式的结构这样能够将请求沿着这条链进行传递,直到有接收者对它进行处理. UML类图: 主要包含: Handler:定义了一个处理请求的接口,实现了定义后继者的方法. ConcreteHandler:处理各自负责的请求,假设不能处

设计模式之职责链模式(Chain of Responsibility)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

[设计模式] 责任链模式 Chain of Responsibility

转    http://blog.csdn.net/wuzhekai1985   http://www.jellythink.com/archives/878 向项目经理提交了休假申请,我的项目经理向项目主管提交了我的休假申请,项目主管向部门经理提交了我的休假申请:最后,部门经理同意了我的休假申请.是的,一个简单的休假申请,需要这么复杂的流程,这也是一个公司保证它正常运行的必要.如果部门经理休假了,那么我的休假申请由谁审批呢?这个时候由项目主管代替部门经理进行审批.一个休假申请的审批制度有着严格

行为型设计模式之职责链模式(Chain of Responsibility)

结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 1 using System; 2 3 abstract class Handler 4 { 5 protected Handler successorHand