设计模式--职责链模式

来源:互联网 发布:mac能玩csgo吗 编辑:程序博客网 时间:2024/05/22 13:08

结构型模式已经学习完了。接下来学习的是对象行为模式的第一种模式,职责链模式。首先行为模式涉及到了算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。行为对象模式使用对象复合而不是继承。
职责链模式(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