【软件设计师中级】责任链模式学习笔记(c++)

本文详细介绍了责任链模式的概念、结构和适用性,通过一个公司报销流程的例子展示了如何运用UML进行类的设计。在代码实现部分,创建了两个具体的处理类,模拟了财务部长和总经理的审批过程,展示了如何构建和操作处理链。
摘要由CSDN通过智能技术生成

目录

1、责任链模式chain of responsibility

(1)意图

(2)结构

(3)适用性

2、根据UML编写代码

(1) 泛化关系

(2)关联关系

(3)将UML代入生活

3、代码实现


1、责任链模式chain of responsibility

(1)意图

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

 (2)结构

handler定义一个处理请求的接口:(可选)实现后继者

concretehandler处理它的请求:可访问她的后继者,如果可处理该请求,就处理他,否则就请求转发给后继者。

client向链上的具体处理者(concretehandler)对象提供请求 

(3)适用性

有多个对象处理一个请求,那个对象处理该请求运行时刻自动确定。

想不在明确制定接受的情况下向多个对象中一个提交一个请求。

可处理要给请求对象集合应被动态制定

2、根据UML编写代码

   (1) 泛化关系

     结构中hangler作为父类有两个具体子类(concretehandler1、concretehandler2),由两个子类具体实现对应的操作。

(2)关联关系

   在不考虑客户端的情况handler有个自关联,简而言之就是在自己的内部生成一个指向自己的指针,注意该指针在后续的操作中将提供给子类使用,原则上放在protected下。

(3)将UML代入生活

这个结构相对非常简单,该结构的理解我们可以用一个公司的报销例子完成:

   张三她昨天请甲方吃了一顿饭,请甲方吃饭的费用报销需要财务部长和总经理两人同意,报销流程大致如下:首先张三填写好报销单拿给财务部长审核,财务部长在验证发票和报销填写无误后,提交给总经理,总经理在根据她个人判断决定要不要给张三报销。

 

     这个过程非常清晰,财务部长只能在自己职责范围作出处理,他无法处理的事务就需要提交更高权限的人来审核。

3、代码实现

#include<iostream>
#include <stdio.h>
using namespace std;
class handler{
    public:
        handler(){}
        virtual  void handlerequest()=0;
        virtual ~handler(){}
    protected:
        handler *next;//自关联

};

class concretehandler2:public handler{
    public:
        void handlerequest(){
            cout<<"请总经理审批Y/N"<<endl;
            c=getchar();
            getchar();
            if (c=='Y'or c=='y'){
                cout<<"报销审核通过,请尽快找出纳报销该费用"<<endl;
            }else{
                cout<<"总经理审批不过"<<endl;
            }
        }

        ~concretehandler2(){
            delete next;
        }
    private:
        char c;
};
class concretehandler1:public handler{
    public:
        void handlerequest(){
            cout<<"请财务部长审批Y/N"<<endl;
            c=getchar();
            getchar();
            if (c=='Y'or c=='y'){
                next=new concretehandler2;//形成链
                 cout<<"财务审核通过,请提交总经理签字"<<endl;
                next->handlerequest();
            }else{
                cout<<"财务审批不过"<<endl;
            }
        }
        ~concretehandler1(){
            delete next;
        }
    private:
        char c;
};

int main(){
    handler *a=new concretehandler1;
    a->handlerequest();
    delete a;
    return 0;
}

输出结果: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值