首页 > 其他分享 >实验15:职责链模式

实验15:职责链模式

时间:2023-12-09 20:44:23浏览次数:22  
标签:15 职责 order 实验 handleRequest successor Leader string name

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 

1、理解职责链模式的动机,掌握该模式的结构;

2、能够利用职责链模式解决实际问题。

 

[实验任务一]:财务审批

某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审批20万元及以下的采购单,20万元以上的采购单需要开职工大会确定。现用职责链模式设计该系统。

实验要求:

1. 提交类图;

2. 提交源代码;

3. 注意编程规范。

#include <iostream>

#include <string>

using namespace std;

 

class Order {

private:

    string orderName;

    float orderAmount;

 

public:

    Order(string orderName, float orderAmount) {

        this->orderName = orderName;

        this->orderAmount = orderAmount;

    }

    void setOrderName(string name) {

        this->orderName = name;

    }

    void setOrderAmount(float amount) {

        this->orderAmount = amount;

    }

    string getOrderName() {

        return this->orderName;

    }

    float getOrderAmount() {

        return this->orderAmount;

    }

};

 

class Leader {

protected:

    string name;

    Leader* successor=NULL;

public:

    Leader() {};

    Leader(string name) { this->name = name; }

    void setSuccessor(Leader* successor) { this->successor = successor; }

    virtual void handleRequest(Order order) {};

};

 

class Director:public Leader {

public:

    Director() {};

    Director(string name) :Leader(name) {};

    void handleRequest(Order order) {

        if (order.getOrderAmount() <= 10000) {

            cout << this->name << "主任,可以处理采购单:" << order.getOrderName()  << "  价格为:------" << order.getOrderAmount() << endl;

        }

        else if (this->successor != NULL) {

            this->successor->handleRequest(order);

        }

    }

};

 

class DepartmentManager :public Leader {

public:

    DepartmentManager() {};

    DepartmentManager(string name) :Leader(name) {};

    void handleRequest(Order order) {

        if (order.getOrderAmount() <= 50000) {

            cout << this->name << "部门经理,可以处理采购单:" << order.getOrderName() << "  价格为:------" << order.getOrderAmount() << endl;

        }

        else if (this->successor != NULL) {

            this->successor->handleRequest(order);

        }

    }

};

 

class DeputyGeneralManager :public Leader {

public:

    DeputyGeneralManager() {};

    DeputyGeneralManager(string name) :Leader(name) {};

    void handleRequest(Order order) {

        if (order.getOrderAmount() <= 100000) {

            cout << this->name << "副总经理,可以处理采购单:" << order.getOrderName() << "  价格为:------" << order.getOrderAmount() << endl;

        }

        else if (this->successor != NULL) {

            this->successor->handleRequest(order);

        }

    }

};

 

class GeneralManager : public Leader {

public:

    GeneralManager() {};

    GeneralManager(string name) :Leader(name) {};

    void handleRequest(Order order) {

        if (order.getOrderAmount() <= 200000) {

            cout << this->name << "总经理,可以处理采购单:" << order.getOrderName() << "  价格为:------" << order.getOrderAmount() << endl;

        }

        else if (this->successor != NULL) {

            this->successor->handleRequest(order);

        }

    }

};

 

int main() {

    Order o1("order1",10000), o2("order1", 50000), o3("order1", 100000), o4("order1", 200000);

 

    Leader* l1, *l2, *l3, *l4;

 

    l1 = new Director("小李");

    l2 = new DepartmentManager("小张");

    l3 = new DeputyGeneralManager("小刘");

    l4 = new GeneralManager("小王");

 

    l1->setSuccessor(l2);

    l2->setSuccessor(l3);

    l3->setSuccessor(l4);

 

    l1->handleRequest(o1);

    l1->handleRequest(o2);

    l1->handleRequest(o3);

    l1->handleRequest(o4);

 

 

    delete l1, l2, l3, l4;

}

 

标签:15,职责,order,实验,handleRequest,successor,Leader,string,name
From: https://www.cnblogs.com/lin513/p/17891457.html

相关文章

  • 实验16:命令模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解命令模式的动机,掌握该模式的结构;2、能够利用命令模式解决实际问题。 [实验任务一]:多次撤销和重复的命令模式某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集......
  • 实验14:代理模式
    [实验任务一]:婚介所婚介所其实就是找对象的一个代理,请仿照我们的课堂例子“论坛权限控制代理”完成这个实际问题,其中如果年纪小于18周岁,婚介所会提示“对不起,不能早恋!”,并终止业务。实验要求:1. 提交类图;、2.提交源代码;3.注意编程规范。packageorg.example;publicclas......
  • Linux p15 定时任务调度
    【学习课程】:【【小白入门通俗易懂】2021韩顺平一周学会Linux】https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e0549e定时任务调度一、crond任务调度基本介绍crontab进行定时任务的设置概述任务调......
  • 【洛谷 P2670】[NOIP2015 普及组] 扫雷游戏 题解(模拟)
    [NOIP2015普及组]扫雷游戏题目背景NOIP2015普及组T2题目描述扫雷游戏是一款十分经典的单机小游戏。在行列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的......
  • 【单片机】实验七:定时计数器实验
    #include<STC8.H>/*#定时计数器溢出发生中断原理实验@2023N12Y7R#P1:控制显示内容#P2:控制显示位置实验目的:利用单片机内部定时器T0或者T1,控制一个LED数码管实现数字0-9循环显示,精确执行每一秒显示一个数字*/unsignedcharled[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7......
  • 「杂题乱刷」洛谷P1544
    题目链接数字三角形的变形。直接在原来的基础上加个判断\(3\)倍的就行了。参考代码:点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlongn,m,ans=-1e18,a[110][110],dp[110][110][5010];#definelc(x)x<<1#definerc(x)x<<1|1#definelowbit(x)x&-......
  • P1541-DP【绿】
    刚开始理解错题意了,题中说“玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片”指的是不能用同一张卡片,我给理解成不能连续用同一种卡片了。后来想想其实题目中的说法歧义不大,是我粗心才导致看错的。最终我看错的导致了题目难度更高一些,偏偏写完了更高难度的题之......
  • flannel网络实验
    一、部署flannel(注意安装cni)下载地址:https://github.com/flannel-io/flannelwgethttps://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.ymlkubectlapply-fkube-flannel.yml启动报错: Errorregisteringnetwork:failedtoacquireleas......
  • 27-1 BFD联动实验(OSPF/Static Router/VRRP)
    拓扑要求:1.接入层和汇聚层配置MSTP+VRRP实现高可用性2.汇聚层和核心层配置BFD高可用性3.汇聚层和核心层之间允许OSPF,OSPF配置BFD实现高可用性4.核心层到LSP配置静态路由,要求配置BFD实现高可用性配置基础配置(VLAN+IP)PC1配置,PC2参考PC1Access配置#vlanbatch1020#......
  • 最新:2024年值得关注的15款顶级开源项目管理系统!
    推荐15个优秀的开源项目管理工具,比如:ProjectLibre、OpenProject、ERPNext、Redmine、禅道、Tuleap、Restyaboard等。项目经理面临各种复杂任务,包括追踪任务的进度、评估交付风险和管理整体工作量。为了顺利达成目标,一款靠谱的项目管理(PM)工具是必不可少的。但是,挑选项目管理工......