定義演算法家族,分別封裝起來,讓它們之間可以互相替換,讓演算法變化,不會影響到使用者
good:適合類中的成員以方法為主,演算法經常變動;簡化了單元測試(因為每個演算法都有自己的類,可以通過自己的介面單獨測試。
策略模式和簡單工廠基本相同,但簡單工廠模式只能解決物件建立問題,對於經常變動的演算法應使用策略模式。
bug:客戶端要做出判斷
例
//策略基類
class coperation
public:
int m_nfirst;
int m_nsecond;
virtual double getresult()
double dresult=0;
return dresult;
//策略具體類—加法類
classaddoperation : public coperation
public:
addoperation(int a,int b)
m_nfirst=a;
m_nsecond=b;
virtual double getresult()
return m_nfirst+m_nsecond;
class context
doublegetresult()
}; //客戶端
int main()
int a,b;
char c;
cin>>a>>b;
cout<
cin>>c;
switch(c)
case 『+』:
context *context=newcontext(new addoperation(a,b));
cout
break;
default:
break;
return 0;
策略與工場相結合
good:客戶端只需訪問context類,而不用知道其它任何類資訊,實現了低耦合。
在上例基礎上,修改下面內容
class context
private:
coperation* op;
public:
context(charctype)
} double getresult()
return op->getresult();
//客戶端
int main()
int a,b;
cin>>a>>b;
context *test=newcontext('+');
cout
return 0;
單一職責原則
就乙個類而言,應該僅有乙個引起它變化的原因。
如果乙個類承擔的職責過多,就等於把這些職責耦合在一起,乙個職責的變化可能會削弱或者抑制這個類完成其它職責能力。這種耦合會導制脆弱的設計,當變化發生時,設計會遭受到意想不到的破壞。
如果你能夠想到多於乙個的動機去改變乙個類,那麼這個類就具有多於乙個的職責。
開放--封閉原則
軟體實體可以擴充套件,但是不可修改。即對於擴充套件是開放的,對於修改是封閉的。面對需求,對程式的改動是通過增加**來完成的,而不是改動現有的**。
當變化發生時,我們就建立抽象來隔離以後發生同類的變化。
開放――封閉原則是物件導向的核心所在。開發人員應該對程式中呈現出頻繁變化的那部分做出抽象,拒絕對任何部分都刻意抽象及不成熟的抽象。
黎克特制代換原則
乙個軟體實體如果使用的是乙個父類的話,那麼一定適用其子類。而且它察覺不出父類物件和子類物件的區別。也就是說:在軟體裡面,把父類替換成子類,程式的行為沒有變化。
子型別必須能夠替換掉它們的父型別。
依賴倒轉原則
抽象不應該依賴細節,細節應該依賴抽象。即針對介面程式設計,不要對實現程式設計。
高層模組不能依賴低層模組,兩者都應依賴抽象。
依賴倒轉原則是物件導向的標誌,用哪種語言編寫程式不重要,如果編寫時考慮的是如何針對抽象程式設計而不是針對細節程式設計,即程式的所有依賴關係都終止於抽象類或介面。那就是物件導向設計,反之那就是過程化設計。
二 策略模式
在策略模式 strategy pattern 中,乙個類的行為或其演算法可以在執行時更改。這種型別的設計模式屬於行為型模式。在策略模式中,我們建立表示各種策略的物件和乙個行為隨著策略物件改變而改變的 context 物件。策略物件改變 context 物件的執行演算法。主要解決了 在有多種演算法相似...
(二)策略模式
簡單工廠模式只是解決物件的建立問題,而且由於工廠本身包括了所有的收費方式,商場可能經常性的更改打折額度和返利額度,每次維護或者擴充套件收費方式都要改動這個工廠,以致 需要重新編譯部署,這不是一種好方法。而且為了建立不同的物件產品使用了switch case 或if else 的形式實現 這樣違背了開...
二 策略模式
策略模式是一種定義一系列演算法的方法,從概念上來看,所有這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類之間的耦合 策略模式封裝了變化 在實踐中,我們發現可以用它來封裝幾乎任型別的規則,只要在分析過程中聽到需要在不同時間應用到不同的業...