設計模式之策略模式 多種實現方式

2021-10-01 16:58:07 字數 3034 閱讀 3170

策略模式作為一種軟體設計模式,指物件有某個行為,但是在不同的場景中,該行為有不同的實現演算法。比如每個人都要「交個人所得稅」,但是「在美國交個人所得稅」和「在中國交個人所得稅」就有不同的算稅方法。

主要是為了**的解耦,避免每次新增策略的時候都影響到之前的策略邏輯(開閉原則),降低**的耦合有利於後面**的延伸(新增行為),並確保每次新增策略(功能)時都不會影響到原來的**邏輯!

策略模式uml圖 :

策略介面

public

inte***ce

bonusstrategy

策略實現
public

class

t1handler

implements

bonusstrategy

}public

class

t2handler

implements

bonusstrategy

}

策略背景
public

class

bonusmapcontext

public

static

void

getbonus

(string stafflevel)

bonusstrategy.

bonus();}}

這樣,乙個簡單的策略模式就編寫出來了,目前我們只有t1和t2級別的員工才有年終獎,其他級別的員工都是沒有獎金的! 剝削的資本主義!!! 如果我們公司規模變大了(世界500強),需要新增乙個t3級別年終獎,我們只需新增乙個t3handler類就行了,然後手動把它put到strategy_map裡去就行, 但是這樣我們還是違背了』開閉原則』,為了更好的維護,此時我們將**稍微修改一下.

實現initializingbean介面(自動註冊)

新增bonusregister方法

public

class

bonusmapcontext

bonusstrategy.

bonus()

;}public

static

void

bonusregister

(string stafflevel, bonusstrategy bonusstrategy)

strategy_map.

put(stafflevel, bonusstrategy);}

}

策略類實現initializingbean介面,並自動註冊

@component

public

class

t1handler

implements

bonusstrategy

, initializingbean

@override

public

void

afterpropertiesset()

throws exception

}@component

public

class

t2handler

implements

bonusstrategy

, initializingbean

@override

public

void

afterpropertiesset()

throws exception

}

我們在bonusmapcontext中新增了註冊方法,這樣子我們以後新增策略的時候,只需要讓該策略實現initializingbean介面,並自動註冊即可,這樣子就遵循了』開閉原則』,不需要每次都要去修改strategy_map,但是這樣子我們後面的每個策略類都要實現initializingbean介面,這部分的邏輯是與業務完全無關的,雖然實現了自動註冊,但是**還是有冗餘,需要注意的是,該實現類必須要有@component、@service註解,否則afterpropertiesset方法將不起作用!因為只有bean被初始化時,才會執行afterpropertiesset方法!!!

基於springboot實現策略模式

@component

("t1"

)public

class

t2handler

implements

bonusstrategy

}@component

("t2"

)public

class

t1handler

implements

bonusstrategy

}

此時**已經編寫完畢,我們新建個testcontroller來測試一下

@controller

public

class

testcontroller}}

列印結果為

需要注意的是handler類中的value必須要是t1或者t2等自己定義的型別,否則將預設使用類名(駝峰命名)作為key,這樣子我們還是會找不到對應的策略類.

經過上面**的比較,我們會發現基於springboot實現策略模式是最友好的一種方式,我們後續新增策略只需要新增handler類,然後新增註解就可以了,springboot會幫我們自動注入到上下文中的strategy_map中,實際上在日常工作中,這樣那樣的需求可以用到策略模式,但是在使用設計模式的時候,我們需要同時考慮到後期的維護,如果是簡單的邏輯並且後續拓展型別的可能性很小,我們可以直接使用if else,這樣的**是最簡潔最實用的,如果專案中同事的水平看不懂,這也會帶來問題,如果為了使用設計模式而使用,那麼這將毫無價值

單例設計模式多種實現方式

public class singleton 私有化建構函式,防止new物件 public static singleton getinstance public class singleton public static singleton getinstance return intance 這...

設計模式之策略模式

include using namespace std 飛行行為介面類 class flystrategy 高空飛行行為具現類 class heightfly public flystrategy virtual void fly private heightfly 低空飛行行為具現類 class ...

設計模式之 策略模式

策略模式 strategy pattern 定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。策略模式是一種定義了一系列演算法的方法,從概念上來看,所以得這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有的演算法,減少了各...