摘要
《c++ primer》習題14.38和14.39分別採用策略模式、模版方法解決問題。
問題
《c++ primer 5th》習題 14.38 : 編寫乙個類令其檢查某個給定的 string 物件的長度是否與乙個閥值相等。使用該物件編寫程式,統計並報告輸入的檔案中長度為 1 的單詞有多少個、長度為 2 的單詞有多少個、......、長度為 10 的單詞有多少個。
解法一 模版方法 template method
uml 類圖如下:
solution **如下:
template structequalsolution **如下:solution
virtual ~solution() {}
virtual
void
operator() (const t& e) = 0
; unsigned
intval;
int times = 0
;};
template struct equalsolution : public solutiongreatersolution **如下:};
template struct greatersolution : public solutionlessersolution **如下:};
template struct lessersolution : public solution客戶端呼叫**如下:};
int解法二 策略方法 + 工廠方法uml類圖如下:main()
; solution
* es = new equalsolution(1
); solution
* ls = new lessersolution(5
); solution
* gs = new greatersolution(5
);
for (auto &e : v)
cout
<< "
長度等於 1 的有幾個:
"<< es->times <
cout
<< "
長度小於 5 的有幾個:
"<< ls->times <
cout
<< "
長度大於 5 的有幾個:
"<< gs->times <
return0;
}
comparestrategy **如下:
structequalstrategy **如下:comparestrategy ;
};
struct equalstrategy : publicgreaterstrategy **如下:comparestrategy
};
struct greaterstrategy : publiclesserstrategy **如下:comparestrategy
};
struct lesserstrategy : publiccontext **如下:comparestrategy
};
struct客戶端呼叫**如下:context
context(
char type, int
v) : val(v) }};
int總結兩種模式下,耦合度都不高,但是採用策略模式更合乎人類的思維。main() ;
context c1('e
', 3
); context c2('g
', 3
); context c3('l
', 3
);
for (auto &e : v)
cout
<< c1.times <
cout
<< c2.times <
cout
<< c3.times <
return0;
}
所以這道題,策略模式更適用。
兩種單例設計模式
設計模式是在大量的實踐中總結和理論化之後優選的 結構 程式設計風格 以及解決問題的思考方式。設計模式就像是經典的棋譜,不同的棋局,我們用不同的棋譜,免去我們自己再思考和摸索。所謂類的單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項...
關於設計模式的一道題目
乙個系統,提供多個http協議的介面,返回的結果y有json格式和jsonp格式。json的格式為,為了保證該協議變更之後更好的應用到多個介面,為了保證修改協議不影響到原先邏輯的 以下哪些設計模式是需要的?協議的變更指的是日後可能返回xml格式,或者是根據需求統一對返回的訊息進行過濾。a.aadap...
設計模式的兩種分類依據
設計模式有兩種分類方法,即根據模式的目的來分和根據模式的作用的範圍來分。1.根據目的來分 根據模式是用來完成什麼工作來劃分,這種方式可分為建立型模式 結構型模式和行為型模式 3 種。建立型模式 用於描述 怎樣建立物件 它的主要特點是 將物件的建立與使用分離 gof 中提供了單例 原型 工廠方法 抽象...