设计模式--职责链模式
来源:互联网 发布: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
- 职责链设计模式
- 【设计模式】职责链
- 设计模式---职责链
- 职责链设计模式
- 职责链设计模式
- 设计模式---职责链模式
- 设计模式-职责链模式
- 设计模式 职责链模式
- 设计模式- 职责链模式
- 设计模式 - 职责链模式
- 设计模式 - 职责链模式
- 设计模式-职责链模式
- 设计模式--职责链模式
- 设计模式-职责链模式
- 设计模式--职责链模式
- 设计模式-职责链模式
- 【设计模式】职责链模式
- 设计模式-职责链模式
- String to Integer (atoi)
- 八皇后问题
- 2015071905 - 你付出了什么?
- Palindrome Number
- Tomcat虚拟目录的配置
- 设计模式--职责链模式
- java常用类源代码探究(二):装箱类
- HDU1201 18岁生日
- 源代码控制管理工具_git&svn
- Linux下网络排查之ping|traceroute|mtr工具
- linux程序设计——IPC状态命令(第十四章)
- java基础之instanceof的用法详解
- 逻辑斯谛回归与最大熵模型
- Longest Common Prefix