詳解C++設(shè)計模式編程中責(zé)任鏈模式的應(yīng)用
職責(zé)鏈模式:使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
其思想很簡單,比如考慮員工要求加薪。公司的管理者一共有三級,總經(jīng)理、總監(jiān)、經(jīng)理,如果一個員工要求加薪,應(yīng)該向主管的經(jīng)理申請,如果加薪的數(shù)量在經(jīng)理的職權(quán)內(nèi),那么經(jīng)理可以直接批準(zhǔn),否則將申請上交給總監(jiān)。總監(jiān)的處理方式也一樣,總經(jīng)理可以處理所有請求。這就是典型的職責(zé)鏈模式,請求的處理形成了一條鏈,直到有一個對象處理請求。給出這個例子的UML圖。
UML結(jié)構(gòu)圖:

一個責(zé)任鏈模式例子
*該例子是三類售貨員處理訂單的情況
*如果訂單金額小于1000,則一級售貨員可以處理該訂單
*如果訂單金額小于10000,則二級售貨員可以處理該訂單
*如果訂單金額小于100000,則三級售貨員可以處理該訂單
using System;
/**//// <summary>
///售貨員接口,所有類型的售貨員必須實現(xiàn)該接口
/// </summary>
interface ISalesMan
{
string Name {set;get;} //售貨員名字
void SetNext(ISalesMan nextSalesMan); //設(shè)置下一級售貨員
void Process(Order order); //處理訂單
}
/**//// <summary>
/// 訂單類
/// </summary>
class Order
{
private int orderAmount;
public int Amount
{
set{ this.orderAmount = value;}
get{ return this.orderAmount; }
}
}
/**//// <summary>
/// 一類售貨員
/// </summary>
class FirstSalesMan : ISalesMan
{
private ISalesMan nextSalesMan = null;
private string name = string.Empty;
ISalesMan 成員ISalesMan 成員
}
/**//// <summary>
/// 二類售貨員
/// </summary>
class SecondSalesMan : ISalesMan
{
private ISalesMan nextSalesMan = null;
private string name = string.Empty;
ISalesMan 成員ISalesMan 成員
}
/**//// <summary>
/// 三類售貨員
/// </summary>
class ThirdSalesMan : ISalesMan
{
private ISalesMan nextSalesMan = null;
private string name = string.Empty;
ISalesMan 成員ISalesMan 成員
}
class Client
{
public static void Main(string[] args)
{
FirstSalesMan first = new FirstSalesMan();
first.Name = "firstMan";
SecondSalesMan second = new SecondSalesMan();
second.Name = "secondMan";
ThirdSalesMan third = new ThirdSalesMan();
third.Name = "thirdMan";
first.SetNext(second);
second.SetNext(third);
Order o = new Order();
o.Amount = 300;
first.Process(o);
o = new Order();
o.Amount = 1300;
first.Process(o);
o = new Order();
o.Amount = 11300;
first.Process(o);
Console.Read();
}
}
責(zé)任鏈模式適用場景
- 有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。
- 你想在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。
- 可處理一個請求的對象集合應(yīng)被動態(tài)指定。
相關(guān)文章
在C++中關(guān)于友元函數(shù)的進(jìn)一步理解
今天小編就為大家分享一篇關(guān)于在C++中關(guān)于友元函數(shù)的進(jìn)一步理解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
QT連接Mysql數(shù)據(jù)庫的實現(xiàn)步驟
本文主要介紹了QT連接Mysql數(shù)據(jù)庫的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
C++實現(xiàn)簡單校園導(dǎo)游系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡單校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03

