C++设计模式-职责链模式
目錄
?
?
基本概念
代碼與實例
在哪種地方使用
?
基本概念
職責鏈模式(Chain of Responsibility):時多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這個對象連接成一條鏈,并沿著這條鏈條傳遞該請求,直到有一個對象處理它為止。
這里發出這個請求的客戶端并不知道這當中的哪個對象最終處理這個請求,這樣系統的更改可以在不影響客戶端的情況下動態的重新組織和分配責任。
結構圖如下(此圖來源于大話設計模式)
職責鏈的好處:當客戶提交一個請求時,請求是沿著鏈傳遞直至有一個ConcreteHandler對象負責處理它。隨時的增加或修改處理一個請求的結構。增強了對象指派職責的靈活性。一個請求極可能導論鏈的末端都得不到處理,或者因為沒有正確配置而得不到處理。
?
代碼與實例
程序運行截圖如下:
Head.h
#ifndef HEAD_H #define HEAD_H#include <iostream> #include <string> using namespace std;//Handler類,定義一個處理請示的接口 class Handler{public:void setSuccessor(Handler *successor);virtual void handleRequest(int request);virtual ~Handler();protected:Handler();Handler(Handler &handler);Handler &operator = (Handler &h);Handler *m_successor; };/* ConcreteHandler類,具體處理者類,處理它所負責的請求,可訪問它的后繼者,如果可處理該請求就處理之, 否則就將該請求轉發給它的后繼者。 *///ConcreteHandler1,當請求數在0到10之間則有權利處理,否則轉到下一位。 class ConcreteHandler1 : public Handler{public:void handleRequest(int request);~ConcreteHandler1(); };//ConcreteHandler2,當請求數在10到20之間則有權處理,否則轉移到下一位 class ConcreteHandler2: public Handler{public:void handleRequest(int request);~ConcreteHandler2(); };//COncreteHandle3,當請求數在20到30之間則有權處理,否則轉移到下一位 class ConcreteHandler3: public Handler{public:void handleRequest(int request);~ConcreteHandler3(); };#endif // !HEAD_HHead.cpp
#include "Head.h" #include <assert.h>void Handler::setSuccessor(Handler *successor) {m_successor = successor; }void Handler::handleRequest(int request) {}Handler::~Handler() {cout << "Handle::~Handle()" << endl; }Handler::Handler() {m_successor = nullptr; }Handler::Handler(Handler &handler) {m_successor = nullptr; }Handler & Handler::operator=(Handler &h) {m_successor = nullptr;return Handler(); }void ConcreteHandler1::handleRequest(int request) {if(request >= 0 && request < 10){cout << "ConcreteHandler1 處理這個消息" << endl;}else if(m_successor != nullptr){m_successor->handleRequest(request);}else{assert(!"雅喵蝶");} }ConcreteHandler1::~ConcreteHandler1() {cout << "ConcreteHandler1::~ConcreteHandler1()" << endl; }void ConcreteHandler2::handleRequest(int request) {if(request >= 10 && request < 20){cout << "ConcreteHandler2 處理這個消息" << endl;}else if(m_successor != nullptr){m_successor->handleRequest(request);}else{assert(!"雅喵蝶");} }ConcreteHandler2::~ConcreteHandler2() {cout << "ConcreteHandler2::~ConcreteHandler2()" << endl; }void ConcreteHandler3::handleRequest(int request) {if(request >= 20 && request < 30){cout << "ConcreteHandler3 處理這個消息" << endl;}else if(m_successor != nullptr){m_successor->handleRequest(request);}else{assert(!"雅喵蝶");} }ConcreteHandler3::~ConcreteHandler3() {cout << "ConcreteHandler3::~ConcreteHandler3()" << endl; }main.cpp
#include "Head.h"int main(int *argc, int *argv[]){Handler *h1 = new ConcreteHandler1;Handler *h2 = new ConcreteHandler2;Handler *h3 = new ConcreteHandler3;h1->setSuccessor(h2);h2->setSuccessor(h3);int requests[] = {5, 9, 12, 14, 16, 21, 27, 2};//int requests[] = {5, 9, 12, 14, 16, 21, 27, 2, 31};for(int i = 0; i < sizeof(requests) / sizeof(requests[0]); i++){h1->handleRequest(requests[i]);}delete h1;delete h2;delete h3;getchar();return 0; }?
在哪種地方使用
轉眼間工作18個月了(加實習),在這18個月的時間,真的是學到了很多東西。下面是本人18個月的工作經驗,對這種設計模式應該可以在哪種地方使用!!
本人認為,可以在2種地方使用!
一種是udp服務器,和某服務器內部采用,舉個栗子!!!
第一種udp服務器:
當接收到數據包后,馬上解析,這里使用職責鏈模式,解析后給對應的handlder,然后對應的handler發送消息給對應的消息隊列(這里舉個例子,使用消息總線,比如RabbitMQ),然后各個處理進程監聽自己的隊列,這樣就可以很好的實現大數據處理和解耦合了!!!!
第二種是某服務器內部:
比如某個會員,他可以花錢提升為V1,V2,V3,V4。當用戶沖錢提升后,先看他有沒有上級,如果有上級,并且提示的等級在他上級之下,就把消息發送給某上級進程(這里同樣可以采用RabbitMQ),當發現等級提示到他上級以上后,就發送給他上級的上級的隊列,最后等級直接發送給管理員,然后給指定的隊列。然后這樣處理,耦合性也處理了!!!
?
總結
以上是生活随笔為你收集整理的C++设计模式-职责链模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMQ笔记-使用rabbitm
- 下一篇: Nginx笔记-关于nginx.conf