职责链模式----C++实现

本文介绍了一种设计模式——职责链模式,它通过构建对象链来处理请求,避免了请求发送者与接收者的直接耦合。适用于请求处理者不确定且可动态指定的情况。文章通过示例代码展示了如何实现这一模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

职责链模式

定义:

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

适用性:

1、  有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

2、  想着不明确指定接收者的情况下,向多个对象中的一个提交请求。

3、  可处理一个请求的对象集合应被动态指定。

 

 

优点:

1、  降低了耦合度

2、  增加了给对象指派职责的灵活性。

 

结构:

实现:

 

//请求级别

enum REQUESTLEVEL

{

       NORMAL = 0,

       ABOVE_NORMAL,

       HIGH

};

//请求类

class Request

{

public:

       Request(string name,int level):m_name(name),m_level(level)

       {  }

       intGetRequestLevel()

       {

              returnm_level;

       }

 

       string GetRequestName()

       {

              returnm_name;

       }

protected:

private:

       string m_name;

       int     m_level;

};

//处理请求的抽象父类

class Handler

{

public:

       virtual void HandleRequest(Request *pRequest) {};

       virtual void SetSuccessor(Handler *phandler){}

protected:

       Handler  *m_pSuccessor;

};

//处理请求的具体类

class ConcreteHandler1:public Handler

{

public:

       ConcreteHandler1(intlevel):m_level(level){}

        void HandleRequest(Request *pRequest)

        {

               if (pRequest&& pRequest->GetRequestLevel() == m_level)

               {

                      cout<<"ConcreteHandler1handle  request :"<<pRequest->GetRequestName()<<endl;

               }

               else if(m_pSuccessor)

               {

                      m_pSuccessor->HandleRequest(pRequest);

               }

        };

        void SetSuccessor(Handler *phandler)

        {

               m_pSuccessor = phandler;

        }

protected:

private:

       int  m_level;     //每个具体类都有对应的可以处理的请求级别

};

 

 

class ConcreteHandler2:public Handler

{

public:

       ConcreteHandler2(intlevel):m_level(level){}

       voidHandleRequest(Request *pRequest)

       {

              if(pRequest && pRequest->GetRequestLevel() == m_level)

              {

                     cout<<"ConcreteHandler2 handle  request :"<<pRequest->GetRequestName()<<endl;

              }

              elseif(m_pSuccessor)

              {

                     m_pSuccessor->HandleRequest(pRequest);

              }

       };

       voidSetSuccessor(Handler *phandler)

       {

              m_pSuccessor = phandler;

       }

protected:

private:

       int  m_level;

};

 

 

class ConcreteHandler3:public Handler

{

public:

       ConcreteHandler3(intlevel):m_level(level){}

       voidHandleRequest(Request *pRequest)

       {

              if(pRequest && pRequest->GetRequestLevel() == m_level)

              {

                     cout<<"ConcreteHandler3 handle  request :"<<pRequest->GetRequestName()<<endl;

              }

              elseif(m_pSuccessor)

              {

                     m_pSuccessor->HandleRequest(pRequest);

              }

       };

       voidSetSuccessor(Handler *phandler)

       {

              m_pSuccessor = phandler;

       }

protected:

private:

       int  m_level;

};

 

       Handler *ph1 = newConcreteHandler1(NORMAL);

       Handler *ph2 = newConcreteHandler2(ABOVE_NORMAL);

       Handler *ph3 = newConcreteHandler3(HIGH);

       Request *pr1 = newRequest("请求1",NORMAL );

       Request *pr2 = newRequest("请求2",ABOVE_NORMAL );

       Request *pr3 = newRequest("请求3",HIGH );

       ph1->SetSuccessor(ph2);

       ph2->SetSuccessor(ph3);

       ph1->HandleRequest(pr1);

       ph1->HandleRequest(pr2);

       ph1->HandleRequest(pr3);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值