博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式C++描述__职责链(Chain of Responsibility)模式
阅读量:4164 次
发布时间:2019-05-26

本文共 3744 字,大约阅读时间需要 12 分钟。

其他模式链接地址:

一. 概述

职责链模式:

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

二. 举个例子

员工要求加薪

公司的管理者一共有三级:总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。

结构图如下:

 \

假设:

经理可以处理薪水的范围在:0~500
总监可以处理薪水的范围在:500~1000
总经理可以处理薪水的范围在:1000~2000

则代码如下:

[cpp] //  
//抽象处理类  
class Handle 
public: 
    virtual ~Handle() 
    { 
        delete _succ; 
    } 
 
    virtual void HandleRequest(int request) = 0; 
     
    //设置其上级  
    void SetSuccessor(Handle* succ) 
    { 
        _succ = succ; 
    } 
 
    Handle* GetSuccessor() 
    { 
        return _succ; 
    } 
 
protected: 
    Handle() 
    { 
        _succ = NULL; 
    } 
 
private: 
    Handle* _succ; 
}; 
 
//具体处理类 A  
class ConcreteHandleA: public Handle 
public: 
    void HandleRequest(int request) 
    { 
        if (request >= 0 && request < 500) 
        { 
            cout << "ConcreteHandleA deal with: " << request <<endl; 
        } 
        else if (this->GetSuccessor() != NULL) 
        { 
            this->GetSuccessor()->HandleRequest(request); 
        } 
        else 
        { 
            cout << "Can't deal with " << request << endl; 
        } 
    } 
}; 
 
//具体处理类 B  
class ConcreteHandleB: public Handle 
public: 
    void HandleRequest(int request) 
    { 
        if (request >= 500 && request < 1000) 
        { 
            cout << "ConcreteHandleB deal with: " << request <<endl; 
        } 
        else if (this->GetSuccessor() != NULL) 
        { 
            this->GetSuccessor()->HandleRequest(request); 
        } 
        else 
        { 
            cout << "Can't deal with " << request << endl; 
        } 
    } 
}; 
 
//具体处理类 C  
class ConcreteHandleC: public Handle 
public: 
    void HandleRequest(int request) 
    { 
        if (request >= 1000 && request < 2000) 
        { 
            cout << "ConcreteHandleC deal with: " << request <<endl; 
        } 
        else if (this->GetSuccessor() != NULL) 
        { 
            this->GetSuccessor()->HandleRequest(request); 
        } 
        else 
        { 
            cout << "Can't deal with " << request << endl; 
        } 
    } 
}; 
 
//  
//测试   
int main()   
    Handle* h1 = new ConcreteHandleA(); 
    Handle* h2 = new ConcreteHandleB(); 
    Handle* h3 = new ConcreteHandleC(); 
 
    //设置其上级  
    h1->SetSuccessor(h2); 
    h2->SetSuccessor(h3); 
 
    h1->HandleRequest(300); 
    h1->HandleRequest(600); 
    h1->HandleRequest(1500); 
    h1->HandleRequest(3000); 
 
    delete h1; 
    delete h2; 
    delete h3; 
 
    return 0;  
//
//抽象处理类
class Handle
{
public:
 virtual ~Handle()
 {
  delete _succ;
 }

 virtual void HandleRequest(int request) = 0;

 
 //设置其上级 
 void SetSuccessor(Handle* succ)
 {
  _succ = succ;
 }

 Handle* GetSuccessor()

 {
  return _succ;
 }

protected:

 Handle()
 {
  _succ = NULL;
 }

private:

 Handle* _succ;
};

//具体处理类 A

class ConcreteHandleA: public Handle
{
public:
 void HandleRequest(int request)
 {
  if (request >= 0 && request < 500)
  {
   cout << "ConcreteHandleA deal with: " << request <<endl;
  }
  else if (this->GetSuccessor() != NULL)
  {
   this->GetSuccessor()->HandleRequest(request);
  }
  else
  {
   cout << "Can't deal with " << request << endl;
  }
 }
};

//具体处理类 B

class ConcreteHandleB: public Handle
{
public:
 void HandleRequest(int request)
 {
  if (request >= 500 && request < 1000)
  {
   cout << "ConcreteHandleB deal with: " << request <<endl;
  }
  else if (this->GetSuccessor() != NULL)
  {
   this->GetSuccessor()->HandleRequest(request);
  }
  else
  {
   cout << "Can't deal with " << request << endl;
  }
 }
};

//具体处理类 C

class ConcreteHandleC: public Handle
{
public:
 void HandleRequest(int request)
 {
  if (request >= 1000 && request < 2000)
  {
   cout << "ConcreteHandleC deal with: " << request <<endl;
  }
  else if (this->GetSuccessor() != NULL)
  {
   this->GetSuccessor()->HandleRequest(request);
  }
  else
  {
   cout << "Can't deal with " << request << endl;
  }
 }
};

//

//测试
int main() 
{
 Handle* h1 = new ConcreteHandleA();
 Handle* h2 = new ConcreteHandleB();
 Handle* h3 = new ConcreteHandleC();

 //设置其上级

 h1->SetSuccessor(h2);
 h2->SetSuccessor(h3);

 h1->HandleRequest(300);

 h1->HandleRequest(600);
 h1->HandleRequest(1500);
 h1->HandleRequest(3000);

 delete h1;

 delete h2;
 delete h3;

 return 0;

}
三. 说明

1. 职责链的特点是:当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。

    2. 职责链的好处是:请求者不用管哪个对象来处理,反正该请求会被处理。它只需保持一个后继者即可。

3. 要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当。

 

作者 lwbeyond

转载地址:http://nvlxi.baihongyu.com/

你可能感兴趣的文章
网友话数万元转行程序员,但是却没人要,网友:是学历问题吗?
查看>>
程序员辞掉30W年薪接私活:6个月就能赚回30W,庆幸自己当初辞职
查看>>
马云四天三谈996被骂上热搜:抱歉,这届年轻人不好“骗”了!
查看>>
中国牛逼的程序员有哪些?入职华为两天转正,半个月升主任
查看>>
为什么大学里的计算机老师,不去大公司当程序员呢?
查看>>
eclipse的java facets的runtimes如何删除tomcat?
查看>>
oracle序列的cache_size说明
查看>>
oracle中两个时间戳相减得到间隔毫秒数
查看>>
Oracle中将毫秒数转换为timestamp类型的两种方法
查看>>
mybatis配置and rownum< minus 查询第几行到第几行数据的sql原型和mybatis原型。
查看>>
oracle的concat函数使用问题。
查看>>
eclipse编辑状态下怎样让指定行左移或右移?
查看>>
plsql developer如何导入导出表结构和数据以及如何复制表结构和数据?
查看>>
oracle如何去除某个字段中两边的空格?
查看>>
plsql developer如何在窗口列表直接可以修改表格中的数据?
查看>>
java自定义注解有什么作用?
查看>>
ORACLE中通过SQL语句(alter table)来增加、删除、修改字段
查看>>
js的Object对象如何访问中间有 . 点号的属性(键),获得其值?
查看>>
@ManyToOne和@OneToMany 注解
查看>>
Java集合(1) - List集合源码解析
查看>>