`
flustar
  • 浏览: 96581 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式学习笔记(十九)—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);
    }
}
模式的使用范围:
1) 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2) 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3) 可处理一个请求的对象集合应被动态指定。
优缺点:
1) 责任的分担。每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。
2) 可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。
3) 类与类之间可以以松耦合的形式加以组织。
4) 责任链模式可能会带来一些额外的性能损耗,因为它要从链子开头开始遍历。

 

 

 

分享到:
评论

相关推荐

    设计模式之美—学习笔记

    职责链模式(Chain of Responsibility)让多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。 在实际编程中,理解并灵活运用设计模式能够提升代码质量,增强系统的可扩展性和可维护性。学习设计...

    C#设计模式学习笔记

    C#设计模式学习笔记是一份详尽的资源,适合任何希望深入了解如何在C#编程中应用设计模式的开发者。这份笔记涵盖了多种设计模式,旨在提升代码的可读性、可维护性和可扩展性,这些都是软件开发中至关重要的要素。 ...

    图解java设计模式_学习笔记_java开发

    行为型模式如策略(Strategy)、观察者(Observer)和职责链(Chain of Responsibility)等,关注对象之间的交互和行为传递。 1. **单例模式**:保证一个类只有一个实例,并提供全局访问点。在Java中,可以使用双重...

    设计模式学习笔记

    1. 责任链模式(Chain of Responsibility):将请求沿着处理者链传递,直到有对象处理为止。 2. 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求或支持撤销操作。 3. 解释器模式...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    23种面向对象设计模式

    文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...

    300Java设计模式部分学习笔记

    1. 责任链模式(Chain of Responsibility Pattern):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 2. 迭代器模式(Iterator Pattern):提供一种方法顺序访问一个聚合对象中的各个...

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    新版设计模式手册-笔记

    行为型模式关注对象之间的职责分配,如策略模式(Strategy)、观察者模式(Observer)和责任链模式(Chain of Responsibility)。策略模式定义了一族算法,将每个算法封装起来,使它们可以互相替换,让算法的变化...

    台湾人写的设计模式笔记

    它们包括:责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observable/Observer)、状态(State)、策略(Strategy)、模板方法...

    23个设计模式图解--学习笔记

    12. **责任链**(Chain of Responsibility):避免将处理请求的责任硬编码到对象中,而是让对象自行决定是否处理请求,以及如何传递请求。 13. **命令**(Command):将请求封装为一个对象,从而使你可用不同的请求...

    设计模式的读书总结笔记

    3. 行为型模式:如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、访问者模式(Visitor)、责任链模式(Chain of Responsibility)、命令模式(Command...

    设计模式 笔记(附带代码)

    6. **责任链模式(Chain of Responsibility)**: 责任链模式是一种行为设计模式,它允许将请求沿着处理者链进行发送,直到某个处理者处理该请求。每个处理者都包含对下一个处理者的引用,可以决定是否处理请求,...

    图解Java设计模式笔记总结word版本.rar

    如策略(Strategy)、模板方法(Template Method)、观察者(Observer)、迭代器(Iterator)、访问者(Visitor)、命令(Command)、责任链(Chain of Responsibility)、备忘录(Memento)、状态(State)和解释器...

    Head First 设计模式 扫描版

    例如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、状态模式(State)、职责链...

    23种设计模式的解析与Cpp实现

    - 责任链模式(Chain of Responsibility):将请求沿链传递,直到某个对象处理它。 - 命令模式(Command):将命令封装为一个对象,以便使用不同的请求、队列请求或支持撤销操作。 - 解释器模式(Interpreter):...

    设计模式笔记设计模式笔记

    - 行为型模式:如责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observer)、状态(State)、策略(Strategy...

    《.NET设计模式》文档

    步步为营 .NET 设计模式学习笔记这个文件名暗示了文档可能采用逐步深入的方式,从基础概念开始,逐步引导读者理解每个模式的用途、实现方式以及在实际.NET项目中的应用。可能包含详细的代码示例,帮助读者通过实践来...

    java23种设计模式,3套视频加1个ppt

    4. **责任链模式(Chain of Responsibility)**:避免请求的发送者和接收者之间的耦合,将多个处理对象连接成链。 5. **命令模式(Command)**:将请求封装为一个对象,以便使用不同的请求、队列请求或支持可撤销的...

Global site tag (gtag.js) - Google Analytics