带你深入浅出设计模式:十、责任链模式:设计模式中的多米诺骨牌效应

此为设计模式谈!

总-分-总的结构生活化的例子给你讲解设计模式!

码农不易,各位学者学到东西请点赞收藏支持支持!

开始部分:

总:责任链的本质是使多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

分:

1.老规矩,打开VS创建一个控制台程序

2.实现编码,这里用学生在学校请假的例子来辅助理解

2.1 抽象处理者,设置下一个节点和获取下一个节点

2.2 具体处理者,实现处理逻辑

2.3 用链表结构来组装责任链

#include <iostream>
using namespace std;

// 抽象处理者:领导者类
class Leader {
public:
    void SetNext(Leader* next) {
        this->mnext = next;
    }

    Leader* GetNext()const {
        return mnext;
    }

    virtual ~Leader() {
    }

    // 处理请求方法
    virtual void HandlerRequest(int days) = 0;

private:
    Leader* mnext;
};

// 具体处理者1:班主任
class headmaster :public Leader {
public:
    void HandlerRequest(int days)override {
        if (days <= 3)
        {
            cout << "\n班主任已经批准你请假:" << days << "天。" << endl;
        }
        else
        {
            if (GetNext() != nullptr)
            {
                GetNext()->HandlerRequest(days);
            }
            else
            {
                cout << "\n你请假的天数太多,没有人能够批准你请假。" << endl;
            }
        }
    }
};

// 具体处理者2:系主任
class departmentHead :public Leader {
public:
    void HandlerRequest(int days)override {
        if (days <= 10)
        {
            cout << "\n系主任已经批准你请假:" << days << "天。" << endl;
        }
        else
        {
            if (GetNext() != nullptr)
            {
                GetNext()->HandlerRequest(days);
            }
            else
            {
                cout << "\n你请假的天数太多,没有人能够批准你请假。" << endl;
            }
        }
    }
};

// 具体处理者3:校长
class principal :public Leader {
public:
    void HandlerRequest(int days)override {
        if (days <= 30)
        {
            cout << "\n校长已经批准你请假:" << days << "天。" << endl;
        }
        else
        {
            if (GetNext() != nullptr)
            {
                GetNext()->HandlerRequest(days);
            }
            else
            {
                cout << "\n你请假的天数太多,没有人能够批准你请假。" << endl;
            }
        }
    }
};


int main()
{
    // 组装责任链
    Leader* t1 = new headmaster();
    Leader* t2 = new departmentHead();
    Leader* t3 = new principal();

    t1->SetNext(t2);
    t2->SetNext(t3);

    // 提交请假请求天数day
    int day = 0;
    cout << "\n\n请输入请假天数:";
    while (cin >> day)
    {
        t1->HandlerRequest(day);
    }

    delete t1;
    t1 = nullptr;
    delete t2;
    t2 = nullptr;
    delete t3;
    t3 = nullptr;    

    return 0;
}

总:责任链模式的优点:增加新的请求处理类非常方便;

缺点:不能保证你的请求一定被接收。(没有一个类能处理这个请求)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值