策略模式(strategy):它定義了演算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。
策略模式就是用來封裝演算法的,實踐中,我們發現可以用它來封裝幾乎任何型別的規則,只要在分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性[dpe]。下面將實現乙個策略模式是商場的收銀系統的demo,參考大話設計模式,利用c++對**進行了改編。該收銀系統有很多計算方式,這裡只列舉了正常的計算方式、滿一定金額返現以及打折這三種方式。這三種演算法可以封裝成單獨的三個類並分別繼承乙個抽象的演算法類,再從乙個類裡對該三種演算法進行處理。貼出**:
//演算法的父類
#ifndef _cash_h
#define _cash_h
class cash
virtual
double paycash(double __money) = 0;
};#endif // ! _cash_h
//正常計算方式
#ifndef _normal_h
#define _normal_h
#include "cash.h"
class paynormal : public cash
~paynormal() {}
virtual
double paycash( double __money )
};#endif
//打折計算方式
#ifndef _rebate_h
#define _rebate_h
#include "cash.h"
class payrebate : public cash
~payrebate() {}
virtual
double paycash(double __money )
private:
double m_rebate;
};#endif
//滿減計算方式
#ifndef _return_h
#define _return_h
#include "cash.h"
class payreturn : public cash
~payreturn() {}
virtual
double paycash(double __money)
return ret;
}private:
double m_condition;
double m_return;
};#endif
//對三種計算方式進行了封裝,在主函式裡看不到這三個演算法類
#ifndef _context_h
#define _context_h
#include "cash.h"
#include "normal.h"
#include "rebate.h"
#include "returncash.h"
#define normal 1
#define return 2
#define rebate 3
class
context
break;
case return:
break;
case rebate:
break;
default:
break;}}
~context()
double getreult( double __money )
private:
cash *m_pcash;
};#endif // ! _context_h
主函式裡只需要把演算法方式給context類,並把金額給context類即可
#include #include "context.h"
int _tmain(int argc, tchar* argv)
該程式的uml圖如下:
執行結果如下:
Design Pattern之模板方法模式
模板方法模式,定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。abstractclass實現了乙個模板方法,定義了演算法的骨架,具體子類將重定義primitiveoperation以實現乙個演算法的步驟。concre...
Design Pattern之工廠方法模式
在本文之前,已經介紹過簡單工廠模式,簡單工廠模式只有乙個工廠,該工廠負責產生所有的運算類,如果增加乙個運算類,不僅需要修改工廠類,還需要修改客戶端類,這違反了設計模式所提倡的開放 封閉原則。本文所說的工廠方法模式就是在之前的簡單工廠模式前提下增加了各種運算方法的工廠類,uml圖如下 相比較簡單工廠模...
Design Pattern之介面卡模式
介面卡模式將乙個類的介面轉換成客戶希望的另外乙個介面。adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。在使用乙個已經存在的類時,如果它的介面,也就是方法和你的要求不同時,就應該考慮用介面卡模式。下面是介面卡的結構圖 如下 class player virtual play...