设计模式--职责链模式

结构型模式已经学习完了。接下来学习的是对象行为模式的第一种模式,职责链模式。首先行为模式涉及到了算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。行为对象模式使用对象复合而不是继承。
职责链模式(chain of responsiblity),定义是:
使多个对象都有机会都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链。并沿着这条链传递该请求。直到有一个对象处理为止。
职责链模式结构图:
职责链模式图
适用性
1 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定
2 想在不明确指定接受者的情况下,向多个对象中的一个提交一个请求
3 可处理一个请求的对象集合应被动态指定
协作
当客户提交一个请求时,请求传递直至有一个ConcreteHandler对象负责处理它
优点
1 降低耦合度
2 增强了给对象指派职责的灵活性
缺点
1 不保证每个请求都有相应的对象处理
实现注意的问题
1 实现后继链
1 定义新的连接
2 使用已有的连接
2 连接后继者
3 表示请求
1 硬编码,方便而且安全,但固定灵活性不高
2 请求码,数字或者字符串,要求发送方和接收方在如何编码问题上达成一致,灵活但需要用条件语句区分派发。另外,类型不是安全的。

// ChainModel.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "CommonManager.h"
#include "MajorManager.h"
#include "GeneraManager.h"

int _tmain(int argc, _TCHAR* argv[])
{
    CommonManager* jinli = new CommonManager("经理");
    MajorManger* major = new MajorManger("总监");
    GeneraManager* genera = new GeneraManager("总经理");

    jinli->setSuper(major);
    major->setSuper(genera);

    Request* request = new Request();
    request->setRequestType("请假");
    request->setRequestContent("小菜请假");
    request->setRequestNum(1);
    jinli->requestApplication(request);

    Request* request1 = new Request();
    request1->setRequestType("加薪");
    request1->setRequestContent("小菜要加薪");
    request1->setRequestNum(500);
    jinli->requestApplication(request1);

    Request* request2 = new Request;
    request2->setRequestType("请假");
    request2->setRequestContent("小菜请假");
    request2->setRequestNum(5);
    jinli->requestApplication(request2);

    Request* request3 = new Request;
    request3->setRequestType("加薪");
    request3->setRequestContent("小菜要加薪");
    request3->setRequestNum(700);
    jinli->requestApplication(request3);

    delete jinli;
    jinli = nullptr;
    delete major;
    major = nullptr;
    delete genera;
    genera = nullptr;

    delete request;
    request = nullptr;
    delete request1;
    request1 = nullptr;
    delete request3;
    request3 = nullptr;
    return 0;
}
/************************************************************************
         @fileName: Request.h 
         @function: 职责连模式的定义请求
         @author: jaime
         @ver: 1.0.0
************************************************************************/

#pragma once
#include <string>

using namespace std;

class Request
{
public:
    Request();
    ~Request();
    void setRequestType(string requestType);
    string getRequestType();
    void setRequestContent(string requestContent);
    string getRequestContent();
    void setRequestNum(int num);
    int getRequestNum();
private:
    string m_requestType;
    string m_requestContent;
    int m_num;
};

#include "Request.h"

Request::Request()
{
}

Request::~Request()
{
}

void Request::setRequestType(string requestType)
{
    m_requestType = requestType;
}

std::string Request::getRequestType()
{
    return m_requestType;
}

void Request::setRequestContent(string requestContent)
{
    m_requestContent = requestContent;
}

std::string Request::getRequestContent()
{
    return m_requestContent;
}

void Request::setRequestNum(int num)
{
    m_num = num;
}

int Request::getRequestNum()
{
    return m_num;
}
/************************************************************************
         @fileName: Car.h
         @function: 职责连模式的定义一个处理请求的接口
         @author: jaime
         @ver: 1.0.0
************************************************************************/
#pragma once

#include <string>
#include "Request.h"

using namespace std;
class Manager
{
public:
    Manager(string name);
    ~Manager();
    void setSuper(Manager* super);
    virtual void requestApplication(Request* request);
private:
    string m_name;
protected:
    Manager* m_super;
};

#include "Manager.h"

Manager::Manager(string name)
:m_name(name)
{

}

Manager::~Manager()
{
}

void Manager::requestApplication(Request* request)
{

}

void Manager::setSuper(Manager* super)
{
    m_super = super;
}
/************************************************************************
          @fileName: CommonManager.h 
          @function: 职责连模式的具体处理请求类
          @author: jaime
          @ver: 1.0.0
************************************************************************/

#pragma once
#include <string>
#include "Manager.h"

using namespace std;

class CommonManager : public Manager
{
public:
    CommonManager(string name);
    ~CommonManager();
    virtual void requestApplication(Request* request);
private:

};

#include "CommonManager.h"
#include <iostream>


CommonManager::CommonManager(string name)
:Manager(name)
{

}

CommonManager::~CommonManager()
{
}

void CommonManager::requestApplication(Request* request)
{
    if ((request->getRequestType() == "请假") && (request->getRequestNum() <= 2))
    {
        cout << "内容" << request->getRequestContent() << endl;
        cout << "数量" << request->getRequestNum() << endl;
        cout << "经理批准" << endl;
    }
    else
    {
        if (m_super != nullptr)
        {
            m_super->requestApplication(request);
        }
    }
}
/************************************************************************
              @fileName: MajorManager.h 
              @function: 职责连模式的具体处理请求类
              @author: jaime
              @ver: 1.0.0
************************************************************************/

#pragma once

#include "Manager.h"
#include <string>

using namespace std;
class MajorManger : public Manager
{
public:
    MajorManger(string name);
    ~MajorManger();
    virtual void requestApplication(Request* request);
private:

};
#include "MajorManager.h"
#include <iostream>
MajorManger::MajorManger(string name)
:Manager(name)
{
}

MajorManger::~MajorManger()
{
}

void MajorManger::requestApplication(Request* request)
{
    if ( (request->getRequestType() == "请假") && (request->getRequestNum() <= 5))
    {
        cout << "内容" << request->getRequestContent() << endl;
        cout << "数量" << request->getRequestNum() << endl;
        cout << "总监批准" << endl;
    }
    else
    {
        if (m_super != nullptr)
        {
            m_super->requestApplication(request);
        }
    }
}
/************************************************************************
@fileName: GeneraManager.h
@function: 职责连模式的具体处理请求类
@author: jaime
@ver: 1.0.0
************************************************************************/

#pragma once

#include "Manager.h"
#include <string>

using namespace std;
class GeneraManager : public Manager
{
public:
    GeneraManager(string name);
    ~GeneraManager();
    virtual void requestApplication(Request* request);
private:

};
#include "GeneraManager.h"
#include <iostream>
GeneraManager::GeneraManager(string name)
:Manager(name)
{
}

GeneraManager::~GeneraManager()
{
}

void GeneraManager::requestApplication(Request* request)
{
    if ((request->getRequestType() == "请假") && (request->getRequestNum() <= 5))
    {
        cout << "内容" << request->getRequestContent() << endl;
        cout << "数量" << request->getRequestNum() << endl;
        cout << "总经理批准" << endl;
    }
    else if ((request->getRequestType() == "加薪") && (request->getRequestNum() <= 500))
    {
        cout << "内容" << request->getRequestContent() << endl;
        cout << "数量" << request->getRequestNum() << endl;
        cout << "总经理批准" << endl;
    }
    else if ((request->getRequestType() == "加薪") && (request->getRequestNum() > 500))
    {
        cout << "内容" << request->getRequestContent() << endl;
        cout << "数量" << request->getRequestNum() << endl;
        cout << "在说吧" << endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值