责任链模式

来源:互联网 发布:朔州seo搜索优化 编辑:程序博客网 时间:2024/05/16 04:22

责任链模式

  • 责任链模式
    • 概念
    • 角色及职责
    • 优缺点
    • 案例

概念

 Chain of Responsibility(CoR)模式也叫职责链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。

  • 例1:比如客户Client要完成一个任务,这个任务包括a,b,c,d四个部分。
      首先客户Client把任务交给A,A完成a部分之后,把任务交给B,B完成b部分,…,直到D完成d部分。

  • 例2:比如政府部分的某项工作,县政府先完成自己能处理的部分,不能处理的部分交给省政府,省政府再完成自己职责范围内的部分,不能处理的部分交给中央政府,中央政府最后完成该项工作。

  • 例3:软件窗口的消息传播。

适用于:
链条式处理事情。工作流程化、消息处理流程化、事物流程化;

角色及职责

这里写图片描述

这里写图片描述

  • Handler
    处理类的抽象父类–里面有一个自己类型的指针做成员变量,类似于链表。

  • concreteHandler
    具体的处理类。

优缺点

  • 优点:

    • 责任的分担。每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。各司其职!
    • 可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。流程可以自由组合!
    • 类与类之间可以以松耦合的形式加以组织。低耦合!
  • 缺点:
      因为处理时以链的形式在对象间传递消息,根据实现方式不同,有可能会影响处理的速度

案例

/*通过用户的状态改变对象当前的行为*/#include <iostream>using namespace std;/*抽象处理类--提供设置对象链的接口,客户端根据对象链将任务按照指定流程完成*/class CarMake{public:    CarMake()    {        m_make = NULL;    }    virtual void MakeCar() = 0;    void setCarMake(CarMake *make)//设置对象链--实际上就是指定当前对象任务完成以后要执行任务的下一个对象    {        m_make = make;    }protected:    CarMake *m_make;//指向下一个要执行任务的具体对象};/*具体处理类--继承自抽象处理类*/class HeadMake:public CarMake{public:    virtual void MakeCar()    {        cout<<"make head"<<endl;//执行自己的任务        if(m_make != NULL)            m_make->MakeCar();//自己的任务处理完毕以后,自动调用下一个具体处理对象的任务    }};/*具体处理类--继承自抽象处理类*/class BodyMake:public CarMake{public:    virtual void MakeCar()    {        cout<<"make body"<<endl;        if(m_make != NULL)            m_make->MakeCar();    }};class TailMake:public CarMake{public:    virtual void MakeCar()    {        cout<<"make tail"<<endl;        if(m_make != NULL)            m_make->MakeCar();    }};int main(){    /*创建具体的处理对象*/    CarMake * head = new HeadMake;    CarMake * body = new BodyMake;    CarMake * tail = new TailMake;    /*设置对象处理链*/    head->setCarMake(body);    body->setCarMake(tail);    tail->setCarMake(NULL);    /*从链表头开始链式执行任务*/    head->MakeCar();    delete   head  ;    delete   body  ;    delete   tail  ;    return 0;}
0 0
原创粉丝点击