設計模式之二 策略模式

2021-08-03 06:52:35 字數 2005 閱讀 9147

在讀大話模式, 對策略模式進行筆記,學習總結;

首先,模擬商場裡的收費系統,計算該商品的總的金額,假如搞**互動,可能是打折;

可能是買多少反現多少

有如下**:

void   test_0() 

cout << "需要付款: " << dtotal << endl;}

那麼這麼寫,所有的業務邏輯都在客戶的**中,在物件導向的思想中,是要將這些邏輯封裝起來;

作為功能的提供者,客戶只需要呼叫介面就可以了;

所以針對具體的商場**,例如正常的情況, 打折的情況, 返現的情況;

// 定義乙個用於計算收費的演算法

class cashsuper 

virtual  double getresult(double dmoney) = 0;

};// 正常的情況

class  cashnormal : public cashsuper };

// 打幾折

class   rebatecash : public cashsuper 

virtual double getresult(double dmoney) 

private:

double   m_drebate;};

// 多少返多少現金

class  returncash : public cashsuper 

virtual  double getresult(double dmoney) 

private:

double    m_cashconditon;

double    m_cashreturn;};

用簡單工廠的這個實現:

實現乙個簡單的工廠類,對建立的物件進行封裝;

**如下:

class  cashfactory 

return pobject;

}static  void   destroycashobject(cashsuper* pcashobject) }};

使用者可以拿這個簡單工廠去使用,工廠只是封裝了物件的建立工程,對於商場來說**活動是會常常變化的,

如果有新的需求,就需要去修改工廠的實現;

對於每一種演算法,要解決的問題都是同乙個,即提供給使用者的介面是一致的,只不過每個演算法的內部實現不一樣;

策略模式就是在這種情況下使用的,用於封裝不同的演算法,使用演算法的人只需要以相同的方式呼叫就行了;

從而降低了演算法類和使用演算法類之間的耦合度;

類圖如下:

需要新增乙個contextstrategy:

**如下:

// 策略模式 

// 策略模式是定義一系列演算法的方法, 所有的演算法完成的都是相同的工作, 介面都是一致的,

// 只是實現不同, 使用演算法的類只要相同的方式呼叫就可以了, 減少了演算法類和使用類之間的耦合;

class   cashcontext 

double   getresult(double dmoney) 

private:

cashsuper*   m_pcashstrategy;};

使用者在使用的時候首先建立乙個具體的策略,然後用該策略去建立乙個context,就可以使用該context用於產生結果,**如下:

cashsuper* pcashstrategy;

switch (etype)

cashcontext  context(pcashstrategy);

double dtotal = nnumber * dprice;

dtotal = context.getresult(dtotal);

從上面的類圖可以看出, 簡單工廠模式和策略模式還是很相似的,

對於工廠模式,使用者看到是: 基類和工廠類;

對於策略模式,使用者看到是: 具體的策略類和策略上下文;

在策略模式中,也可以將策略的建立封裝在context中。

設計模式之二 策略模式

策略模式 這種模式比較適合,同乙個問題又多種解決方法型別的設計。這裡以商場打打折 為例,商場打折對不同的商品可能又不同的打著方式,比如打八折,300減100等等打折方式,這樣的實際問題就很適合使用策略模式。from abc import abcmeta,abstractmethod class co...

設計模式 二 策略模式

定義演算法家族,分別封裝起來,讓它們之間可以互相替換,讓演算法變化,不會影響到使用者 good 適合類中的成員以方法為主,演算法經常變動 簡化了單元測試 因為每個演算法都有自己的類,可以通過自己的介面單獨測試。策略模式和簡單工廠基本相同,但簡單工廠模式只能解決物件建立問題,對於經常變動的演算法應使用...

設計模式(二) 策略模式

策略模式 strategy 它定義了乙個演算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。現金收費抽象類 abstract class cashsuper 正常收費子類 class cashnormal cashsuper 打折收費子類 class ...