java設計模式學習之策略模式

2021-07-28 04:07:18 字數 2059 閱讀 7666

1.介紹

在策略模式(strategy pattern)中,乙個類的行為或其演算法可以在執行時更改。這種型別的設計模式屬於行為型模式。比如我們在計算兩個數字的時候,會有數字相加,數字相減,數字相乘,數字相除幾種方法,一般做法,我們會用乙個 if…else 來判斷,但是這樣有乙個不好的地方就是**複雜化,不利於維護,這時候可以使用策略模式。

2.**例項

未使用策略模式的**寫法:

public int getresult(string type, int

num1, int

num2) else

if (type.equals(

"substract")) else

if (type.equals(

"multiply")) else

if (type.equals(

"division"))

return

0; }

我們可以看出有個弊端,當這個型別特別多,而且每個型別裡面還有自己的演算法,如果演算法比較複雜的話整個條件的控制**會變得很長,難以維護。為了解決這個問題,我們可以使用策略模式。

先建乙個介面:

package com.tl.skyline.pattern.strategypattern;

/** * created by tl on 17/3/9.

*/public

inte***ce

strategy

不同的演算法,實現方式:

operationadd:

package com.tl.skyline.pattern.strategypattern;

/** * created by tl on 17/3/9.

*/public

class

operationadd

implements

strategy

}

operationsubstract:

package com.tl.skyline.pattern.strategypattern;

/** * created by tl on 17/3/9.

*/public

class

operationsubstract

implements

strategy

}

operationmultiply:

package com.tl.skyline.pattern.strategypattern;

/** * created by tl on 17/3/9.

*/public

class

operationmultiply

implements

strategy

}

上下文,檢視當它改變策略 strategy 時的行為變化:

package com.tl.skyline.pattern.strategypattern;

/** * created by tl on 17/3/9.

*/public

class

context

public

intexecutestrategy(int num1, int num2)

}

測試:

package com.tl.skyline.pattern.strategypattern;

/** * created by tl on 17/3/9.

*/public

class

strategypatterndemo

}

輸出:

10 + 5 =15

10 - 5 = 5

10 * 5 = 50

在實際中,spring的ioc就用到了策略模式,通過@resource註解管理,注入哪個就使用哪個。

java 設計模式之策略模式

策略模式非常簡單,也不再舉例子了,它其實就是根據clinet選擇的不同,執行不同的 避免了if.else 和switch case 的不方便和耦合。甚至說你可能平常經常用,只是不知道這是策略模式。類圖 對於擁有公共介面的first,second,third,給clinet提供乙個類context 去...

java設計模式之策略模式

很久沒有更新過設計模式的學習了,最近在看的幾種設計模式在專案實際開發過程中不常用,所以並沒有彙總成部落格寫出來 這一次介紹的是策略模式。策略模式和工廠模式的思想有點類似,都是把物件或資料的獲取封裝起來,需要使用的時候傳入相應的引數獲取相關的物件或資料。工廠模式是對建立物件進行封裝,乙個對操作行為進行...

java設計模式之策略模式

uml設計 定義以及使用場景 定義一系列演算法,將每個演算法單獨封裝,使之可以相互替換,具體方法策略的選擇由客戶端決定,一般適用於多選一的場景。示例 定義乙個介面message,定義兩個類qq wx 都實現了message介面,定義乙個類messagecontroller,訊息控制中心,決定執行me...