设计模式学习笔记(十九)—Chain of Responsibility职责链模式

由于本人水平有限,写出来的东西也许对初学者有所帮助。如果不小心哪位大侠看了不要见笑,哪里有不正确的地方还请批评指正。好了不说废话了。

Chain of Responsibility模式定义:

为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

我的理解:

在不止一个对象可以处理客户端请求的时候,为了使每个对象都有处理请求的机会,把这些对象顺序地串联起来形成一个链,每个被串联的对象都有一个指向下一个对象的指针,当请求到来是,按照顺序,先有第一个对象来处理这个请求,这个对象有两个选择:要么处理,要么把请求传给下一个对象(每个对象都有这两个选择),就这样一直到有一个对象来处理这个请求为止,一旦有一个对象处理了这个请求就停止对请求的传递。当然也有可能到了对象链的最后,也没有一个对象来处理请求。我觉得这个与我们平常写的if…else if…else…要完成的功能太相似了。以上所说的只是Chain of Responsibility的一种情况,有的书上叫它纯职责链模式(我能处理就处理,不能处理才让别人处理),它还有另一种情况也就是不纯职责链模式(我只处理我能处理的部分,处理不了的部分再让别人来处理)。

Chain of Responsibility模式主要涉及两个角色:

1) 抽象处理者角色(Handler):它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。

2) 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。

由于这个模式的UML比较简单,我就不再画出来了。下面我举个例子:一个纯的和一个不纯的。先来个纯的:

现在的女孩子找男朋友基本上都有三个要求:有车、有房、有责任心,如果你这三样都没有,就险了。虽然我没车、也没房、但是我有责任心。^_^

class Boy{
private boolean hasCar; //是否有车
private boolean hasHouse; //是否有房
private boolean hasResponsibility; //是否有责任心
public Boy() {
}
public Boy(boolean hasCar, boolean hasHouse, boolean hasResponsibility) {
  this.hasCar = hasCar;
  this.hasHouse = hasHouse;
  this.hasResponsibility = hasResponsibility;
}
public boolean isHasCar() {
  return hasCar;
}
public void setHasCar(boolean hasCar) {
  this.hasCar = hasCar;
}
public boolean isHasHouse() {
  return hasHouse;
}
public void setHasHouse(boolean hasHouse) {
  this.hasHouse = hasHouse;
}
public boolean isHasResponsibility() {
  return hasResponsibility;
}
public void setHasResponsibility(boolean hasResponsibility) {
  this.hasResponsibility = hasResponsibility;
}
}
interface Handler{
public void handleRequest(Boy boy);
}
class CarHandler implements Handler{//检查是否有车
private Handler handler;public CarHandler(Handler handler) {
  this.handler = handler;
}

public Handler getHandler() {
  return handler;
}

public void setHandler(Handler handler) {
  this.handler = handler;
}

public void handleRequest(Boy boy) {
  if(boy.isHasCar()){
  System.out.println("呵呵,我有辆车");
  }else{
  System.out.println("我没有车");
  handler.handleRequest(boy);
  }

}
}
class HouseHandler implements Handler{ //检查是否有房
private Handler handler;

public HouseHandler(Handler handler) {

  this.handler = handler;
}

public Handler getHandler() {
  return handler;
}

public void setHandler(Handler handler) {
  this.handler = handler;
}

public void handleRequest(Boy boy) {
  if(boy.isHasHouse()){
  System.out.println("没想到吧,我还有房子");
  }else{
  System.out.println("我也没有房");
  handler.handleRequest(boy);
  }

}
}
class ResponsibilityHandler implements Handler{ //检查是否有责任心
private Handler handler;

public ResponsibilityHandler(Handler handler) {
  this.handler = handler;
}

public Handler getHandler() {
  return handler;
}

public void setHandler(Handler handler) {
  this.handler = handler;
}

public void handleRequest(Boy boy) {
  if(boy.isHasResponsibility()){
  System.out.println("我只有一颗带Responsibility的心");
  }else{
  System.out.println("更没有责任心");
  handler.handleRequest(boy);
  }

}
}
class Girl{
public static void main(String[] args){
Boy boy=new Boy(false,false,true);//这个boy没有车,也没有房,不过很有责任心
Handler handler=new CarHandler(new HouseHandler(new ResponsibilityHandler(null)));//也可以使用setHanlder方法
handler.handleRequest(boy);
}
}
为了编这个例子,我死了好多脑细胞。。。。。。。。。。
下面再来个不纯的:
为了让减少脑细胞的死亡数量,这个例子我就不编了,用网上一位大侠所写的。
这个例子模拟了汽车组装的过程:假设一辆汽车从生产到出厂要经过以下四个过程:组装车头,车身,车尾,以及上色。
abstract class CarHandler {
   public static final int STEP_HANDLE_HEAD = 0;
   public static final int STEP_HANDLE_BODY = 0;
   public static final int STEP_HANDLE_TAIL = 0;
   public static final int STEP_HANDLE_COLOR = 3;

   protected CarHandler carHandler;

   public CarHandler setNextCarHandler(CarHandler carHandler) {
    this.carHandler = carHandler;

    return this.carHandler;
   }

   abstract public void handleCar(int lastStep);
}

class CarHeadHandler extends CarHandler {

   @Override
   public void handleCar(int lastStep) {
     if (STEP_HANDLE_HEAD <= lastStep) {
       System.out.println("Handle car's head.");
     }

     if (carHandler != null) {
       carHandler.handleCar(lastStep);
     }
   }
}

class CarBodyHandler extends CarHandler {

   @Override
   public void handleCar(int lastStep) {
     if (STEP_HANDLE_BODY <= lastStep) {
       System.out.println("Handle car's body.");
     }

     if (carHandler != null) {
       carHandler.handleCar(lastStep);
     }
   }
}

class CarTailHandler extends CarHandler {

   @Override
   public void handleCar(int lastStep) {
     if (STEP_HANDLE_TAIL <= lastStep) {
       System.out.println("Handle car's tail.");
     }

     if (carHandler != null) {
       carHandler.handleCar(lastStep);
     }
   }
}

class CarColorHandler extends CarHandler {

   @Override
   public void handleCar(int lastStep) {
     if (STEP_HANDLE_COLOR == lastStep) {
       System.out.println("Handle car's color.");
     }

     if (carHandler != null) {
       carHandler.handleCar(lastStep);
     }
   }
}
public class Client {

   public static void main(String[] args) {
     //工作流程1:先组装车头,然后是车身,车尾,最后是上色
     System.out.println("---workfolow1----");
     CarHandler carHandler1 = new CarHeadHandler();
     carHandler1.setNextCarHandler(
         new CarBodyHandler()).setNextCarHandler(
             new CarTailHandler()).setNextCarHandler(
                 new CarColorHandler());

     carHandler1.handleCar(CarHandler.STEP_HANDLE_COLOR);

     //工作流程2:因为某种原因,我们需要先组装车尾,然后是车身,车头,最后是上色
     System.out.println("---workfolow2---");
     CarHandler carHandler2 = new CarTailHandler();
     carHandler2.setNextCarHandler(
         new CarBodyHandler()).setNextCarHandler(
             new CarHeadHandler()).setNextCarHandler(
                 new CarColorHandler());

     carHandler2.handleCar(CarHandler.STEP_HANDLE_COLOR);
   }
}

时间: 2024-09-11 00:31:15

设计模式学习笔记(十九)—Chain of Responsibility职责链模式的相关文章

php Chain of Responsibility 职责链模式

比如一颗原子弹投下的瞬间,在杀伤范围内的部队或者建筑都会减少血,但是随着距离中心点的远近,受损程度是不同的,而且不同的兵种和建筑受损情况是不同的. 待解决的问题:原子弹投下的瞬间,将杀伤的处理分别交给杀伤范围内的部队或者建筑自己的方法处理. 思路:建立一个接口,让所有的部队或者建筑实现.   职责链模式(Chain of Responsibility)示例:  代码如下 复制代码 <?php //被原子弹攻击的接口 interface NuclearAttacked {     //处理被原子弹

php设计模式 Chain Of Responsibility (职责链模式)

复制代码 代码如下: <?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * */ abstract class Handler { protected $_handler = null; public function setSuccessor($handler) { $this->_handler = $handler; } abstract functio

php设计模式 Chain Of Responsibility (职责链模式)_php技巧

复制代码 代码如下: <?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * */ abstract class Handler { protected $_handler = null; public function setSuccessor($handler) { $this->_handler = $handler; } abstract functio

设计模式学习笔记(十)—Factory Method模式

<设计模式>一书对Factory Method模式是这样描述的: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类. 我的理解:FatoryMethod模式是一种创建型模式,定义一个用于创建对象的接口的意思是说,我们要定义一个用于创建对象的接口(或者说抽象类,实际上就是个抽象工厂abstractFactory),它的内部有一个创建对象的方法,这个方法的返回值是一个接口(或者抽象类)的类型,这个方法就是FactoryMethod:让子类

kvm虚拟化学习笔记(十九)之convirt集中管理平台搭建

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1305553 kvm虚拟化学习笔记(二十)之convirt安装linux系统 http://koumm.blog.51cto.com/703525/1306526 情况说明: (1)本文采用OEL6.3x64操作系统,需要有KVM安装环境.(2)convirt2.1.1采用源码方式安装,convirt环境分别两部分,一部分

设计模式学习笔记(十六)—Proxy模式

一.Proxy模式定义: 为其他对象提供一种代理以控制这个对象的访问. 二.模式解说 Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上.在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层,这个访问层也叫代理.Proxy模式是最常见的模式,在我们生活中处处可见,例如我们买火车票

javascript学习笔记(十九) 节点的操作实现代码_基础知识

本节要用到的html例子 复制代码 代码如下: <ul id="myList"> <li>项目一</li> <li>项目二</li> <li>项目三</li> </ul> 1.创建元素节点 document.createElement() 方法 用于创建元素,接受一个参数,即要创建元素的标签名,返回创建的元素节点 复制代码 代码如下: var div = document.createEle

设计模式学习笔记(十八)—Mediator中介者模式

一.模式定义: 用一个中介者对象来封装一系列的对象交互.中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互. 二.结构图 1) 抽象中介者:定义同事(Colleague)对象到中介者(Mediatior)对象的接口,通常是一个事件方法. 2) 具体中介者:具体中介者实现抽象中介者声明的方法.知晓所有的具体同事类,从具体同事接收消息向另外的具体同事类发送命令. 3) 抽象同事类:定义中介者到同事对象的接口,同事对象只知道中介者而不知道其他同事对象. 三.一个例子

设计模式学习笔记(十五)—State模式

一.State模式定义: 允许一个对象在其状态改变时,改变它的行为.看起来对象似乎修改了它的类. 二.模式解说 State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责任交给了具体的状态