簡析設計模式之工廠模式與策略模式的實際組合應用

2022-09-15 13:27:11 字數 2306 閱讀 8320

大家開啟像qq電腦管家這類安全軟體,主介面上顯示的就是體檢按鈕,點下去體檢的項早已經數年前的寥寥之數增加到現在的數十條,而切換到防毒頁面上顯示的無論是快速查殺或者全盤掃瞄也已經從幾年前幾個碟符+記憶體變成了現在掃瞄電腦裡面各個關鍵位置。而對於乙個軟體設計師而言,我們最早應該如何設計這個掃瞄策略以保證能夠滿足後來不斷擴充需求呢?

注:本人並沒有實際分析過像qq管家在這上面的設計,只是寫出一種自認為可以滿足以上需求並且在實際專案中應用過的設計方法。

其實以上需求便是策略模式的實際良好應用,策略模式定義了一系列的演算法,並將每乙個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法獨立於使用它的客戶而獨立變化。如果以qq管家體檢時檢查數字簽名服務,掃瞄host檔案,檢查開機啟動項,掃瞄記憶體四項為例,策略模式應用就是將每一項定義為互相獨立的演算法同時通過抽象介面與客戶端連線起來,然後依次呼叫完成檢查功能。相關掃瞄策略演算法定義如下:

1

//掃瞄策略的基類

2class

cstrategybase36

virtual ~cstrategybase(){};7//

定義掃瞄介面,用於檢查

8virtual bool scan() = 0;9

//定義修復介面,用於修復該項出現的問題

10virtual bool repair() = 0;11

void setscanresult()

12 bool getscanresult()

13private:14

bool m_bissafely;

15};

1617

class cscanautorun : public

cstrategybase

1826

27virtual

bool repair()

2833

return

true;34}

35};

3637

class cscanhostfile : public

cstrategybase

3846

47virtual

bool repair()

4853

return

true;54}

55};

5657

class cscanmemfile : public

cstrategybase

5866

67virtual

bool repair()

6873

74return

true;75}

76 };

以上便是基本的掃瞄策略,所有的掃瞄演算法都封裝到類中並且由cstrategybase,而實際應用則如下所示:

1     vectorvtscanstrategy;

2 vtscanstrategy.reserve(3);3

4 cstrategybase *pstrategybase =null;

5 pstrategybase = new

cscanmemfile;

6vtscanstrategy.push_back(pstrategybase);

7 pstrategybase = new

cscanhostfile;

8vtscanstrategy.push_back(pstrategybase);

9 pstrategybase = new

cscanautorun;

10vtscanstrategy.push_back(pstrategybase);

1112

int isize =vtscanstrategy.size();

13for (int i = 0;i < isize;i++)

1418

19for (int i = 0;i < isize;i++)

2024

return

0;

以上只是簡單寫了乙個掃瞄功能,,如果需要再次增加掃瞄項時則只需要繼續派生出相應的類,然後new出例項再裝載到響應的向量組中即可,迴圈的時候則會自動掃瞄。但在真正的實際應用時則需新增掃瞄**函式以方便顯示介面。雖然策略方面已經差不多了,但是以上**仍然有許多不足,比如說new例項這部分其實可以弄成乙個工廠模式,將所有申請和裝載操作放在響應的工廠類中。同時工廠模式和策略模式的區別也很明顯了,工廠模式類似於生產零件(即這裡的例項),但是策略模式卻是利用申請出來的例項。倘若是開發類似qq管家體檢功能,設計者只需要專注與掃瞄和修復演算法,至於整個掃瞄框架根本不需要改動,同時也遵循了設計模式的原則之一開閉原則。

設計模式之簡單工廠模式,工廠模式,策略模式

簡單工廠模式 的最大優點是在工廠類中包含了必要的邏輯判斷,根據客戶端的選擇動態例項化相關類,去得到客戶想要的產品。但個人覺得簡單工廠模式的最大優點正是產生它最大缺點之處。因為它的工廠類違反了開放 封閉原則 類,模組,方法等對於擴充套件是開放的,對於更改是封閉的。每當新增乙個功能,我們就需要去修改它的...

JAVA設計模式(十七)設計模式之策略設計模式

本章講解設計模式中策略設計模式的相關知識 1.概念 在策略模式 strategy pattern 中,乙個類的行為或其演算法可以在執行時更改。這種型別的設計模式屬於行為型模式。在策略模式中,我們建立表示各種策略的物件和乙個行為隨著策略物件改變而改變的 context 物件。策略物件改變 contex...

工廠模式與策略模式之區別

設計模式有很多種,其中功能相似的很多,但是為什麼還要分這麼多種名字,查閱資料,我覺得下面的解釋最為合理 用途不一樣,名字就有區別,一把斧頭用來砍人就叫凶器,用來砍柴就叫伐木斧,用來劈門就叫消防斧,這些模式的名字都是根據具體使用時的場景,聯絡了現實裡某樣東西或某種習慣而取得,所以很相似的模式行為有不同...