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