首页 > 其他分享 >责任链模式

责任链模式

时间:2023-12-22 14:35:03浏览次数:33  
标签:handleFeeRequest fee return string 模式 责任 strTemp pHandle

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

template <class T>
string MyConvertToString(T value) {
    stringstream ss;
    ss << value;
    return ss.str();
}

//顶层的抽象类,规范了击鼓传花的组合能力
class Handle {
public:
    void setSuccessor(Handle *pSuccessor){
        this->m_pHandle = pSuccessor;
    }
    virtual string handleFeeRequest(double fee) = 0;
protected:
    Handle* m_pHandle;
};

class PrjManager :public Handle {
public:
    string handleFeeRequest(double fee) {
        string strTemp = "";
        if (fee < 500) {
            strTemp = "项目经理同意" + MyConvertToString(fee) + "费用";
            return strTemp;
        }
        else {
            if (this->m_pHandle != nullptr) {
                return m_pHandle->handleFeeRequest(fee);
            }

        }
        return strTemp;
        
    }
};

class DepManager :public Handle {
public:
    string handleFeeRequest(double fee) {
        string strTemp = "";
        if (fee>=500 &&fee < 1000) {
            strTemp = "部门经理同意" + MyConvertToString(fee) + "费用";
            return strTemp;
        }
        else {
            if (this->m_pHandle != nullptr) {
                return m_pHandle->handleFeeRequest(fee);
            }

        }
        return strTemp;

    }
};

class CEOManager :public Handle {
public:
    string handleFeeRequest(double fee) {
        string strTemp = "";
        if (fee >= 1000) {
            strTemp = "CEO经理同意" + MyConvertToString(fee) + "费用";
            return strTemp;
        }
        else {
            if (this->m_pHandle != nullptr) {
                return m_pHandle->handleFeeRequest(fee);
            }

        }
        return strTemp;

    }
};
int main(void) {
    //先要组装我们的责任链
    Handle* pH1 = new PrjManager;
    Handle* pH2 = new DepManager;
    Handle* pH3 = new CEOManager;
    pH1->setSuccessor(pH2);
    pH2->setSuccessor(pH3);
    cout << pH1->handleFeeRequest(128) << endl;
    cout << pH1->handleFeeRequest(512) << endl;
    cout << pH1->handleFeeRequest(1024) << endl;
    system("pause");
    return 0;
}
代码示例

 

标签:handleFeeRequest,fee,return,string,模式,责任,strTemp,pHandle
From: https://www.cnblogs.com/zeliangzhang/p/17921499.html

相关文章

  • 策略模式:让你的代码灵活应对不同场景
    写在前面如果你正在为代码的可扩展性和可维护性感到烦恼,策略模式可以成为你的得力助手。本篇技术文章详细介绍了策略模式的核心原理和实战应用,帮助你解决在程序设计中所面临的挑战。无论你是初学者还是有一定经验的开发者,这篇文章都能够为你提供有益的知识和实用的技巧,值得一读!前......
  • 设计模式之工厂模式
    工厂模式(工厂模式)工厂将创建对象的细节抽离出来,实现对修改关闭。定义==工厂方法模式==定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。工厂模式有3种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。工厂......
  • Tita丨升级看板模式
    看板模式价值:看板模式可以灵活的对任务进行分类和管理,可以根据项目的需要,来创建不同的看板,根据看板,来把任务进行清晰的分类。对于任务和看板可以进行灵活的拖拽,以此来重新设置任务或看板的位置,它比里程碑对任务的展示更加轻量~Tita-OKR和新绩效一体化管理平台该如何来玩转看......
  • 微服务广播模式实践:维护内存数据的缓存一致性
    本文分享自华为云社区《微服务广播模式实践》,作者:张俭。微服务广播模式,指的是在微服务多实例部署的场景下,将消息广播到多个微服务实例的一种模式。广播模式,一般用来维护微服务的内存数据,根据数据类型的不同,有助于解决两类问题。通常广播模式会使用支持发布订阅的消息中间件实......
  • 官宣!DevExpress Blazor UI组件,支持全新的.NET 8渲染模式
    DevExpress BlazorUI组件使用了C#为BlazorServer和BlazorWebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生BlazorUI组件(包括PivotGrid、调度程序、图表、数据编辑器和报表等)。.NET8为Blazor引入了令人兴奋的重大变化,统一了它的托管模型,并采用了服务器......
  • 中西方全面预算模式异同点
    说说全面预算:凡事预则立,不预则费,中西方在管理思想上有很多方面是不怎么相同的欧美公司做法:无预算不执行,执行的是刚性预算谁的预算谁使用,便于后续考核分析,比如有的公司能预算到每一张打印纸,你用完了只能去找别的组织去借注重分析控制,国外的全面预算软件,比如hyperionplanning,c......
  • 抽象工厂模式
    c#中工厂模式详解 总体介绍:  工厂模式主要有三种类型:简单工厂、工厂方法和抽象工厂,该模式用于封装和管理对象的创建,是一种创建型模式。  万物皆对象,创建对象时必然需要new该对象,当需要更改对象时,需要把项目中所有地方都修改一遍,这显然违背了软件设计的开闭原则。  ......
  • 抖音直播卖货爆品模式细节
    爆品1付费2素材(视频)3时长战略亏损前1-2场亏损开流量3-4场持平长期赚钱1.不上别人卖的好的就是你也可以卖的好的2.做自己感兴趣的行业长期做深耕沉淀3抖音推流分钟制  这波流量的获取取决于上一分钟的数据 关注互动灯牌停留等不要盲目的拉时长 务必播......
  • Canvas三种模式
    1.ScreenSpace-OverlayCanvas永远撑满屏幕并显示在最上层,不绑定Camera(有没有Camera都能显示)。适合用来做最上层的UI。导航栏、分辨率自适应两边的框等。2.ScreenSpace-CameraCanvas自动填充指定摄像机的屏幕,但其他游戏对象(模型等)可以在它之前显示,根据和指定摄像机距离调整是......
  • 观察者模式和发布订阅模式的区别
    观察者模式只有两个对象,一个是观察者(Listener)和被观察者;观察者通过实现被被观察者提供的接口,add到被观察者的Listener列表里;当被观察者内部产生相关事件时,通过其Listener列表来通知观察者; 而发布定义模式则多了一个中介(比如Kafka),即分为了生产者、中介、消费者三个角色了;生产......