行为型模型 责任链模式

行为型模型 责任链模式

Handler
        处理类的抽象父类。
concreteHandler
        具体的处理类。

责任链优缺点
优点:
        1。责任的分担。每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。
        2。可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。
        3。类与类之间可以以松耦合的形式加以组织。
缺点:
        因为处理时以链的形式在对象间传递消息,根据实现方式不同,有可能会影响处理的速度。

适用于:
        链条式处理事情。工作流程化、消息处理流程化、事物流程化;

/**
 * 行为型模型 责任链模式
 * Command模式也叫命令模式 ,是行为设计模式的一种。
 * Chain of Responsibility(CoR)模式也叫职责链模式或者职责连锁模式,是行为模式之一,
 * 该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。
 *
 */

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <list>

class CarHandle
{
public:
    CarHandle * setNextHandle(CarHandle * carhandle)
    {
        this->carhandle = carhandle;
        return this->carhandle;
    }
    virtual void HandleCar() = 0;
    virtual ~CarHandle() {}
protected:
    // 注意: 此变量为保护属性
    CarHandle * carhandle;
};

class CarHandleHead: public CarHandle
{
public:
    virtual void HandleCar() override
    {
        std::cout << "处理车头" << std::endl;
        if (this->carhandle != nullptr)
        {
            this->carhandle->HandleCar();
        }
    }
};

class CarHandleBody: public CarHandle
{
public:
    virtual void HandleCar() override
    {
        std::cout << "处理车身" << std::endl;
        if (this->carhandle != nullptr)
        {
            this->carhandle->HandleCar();
        }
    }
};

class CarHandleTail: public CarHandle
{
public:
    virtual void HandleCar() override
    {
        std::cout << "处理车尾" << std::endl;
        if (this->carhandle != nullptr)
        {
            this->carhandle->HandleCar();
        }
    }
};


void mytest()
{
    CarHandleHead * head = new CarHandleHead();
    CarHandleBody * body = new CarHandleBody();
    CarHandleTail * tail = new CarHandleTail();

    head->setNextHandle(body);
    body->setNextHandle(tail);
    tail->setNextHandle(nullptr);

    head->HandleCar();
    delete head;
    head = nullptr;
    delete body;
    body = nullptr;
    delete tail;
    tail = nullptr;

    return;
}


int main()
{
    mytest();

    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/lsgxeva/p/7782907.html