本文實(shí)例講述了java設(shè)計(jì)模式之策略模式原理與用法。分享給大家供大家參考,具體如下:
策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。其中jdk里面的treeset類和treemap類就用到了策略模式。這兩個(gè)類是帶排序的集合類,其中排序的規(guī)則就相當(dāng)于策略模式里定義的一系列算法,而集合類就相當(dāng)于是策略模式里的環(huán)境類,供用戶使用,用只知道treeset和treemap是帶排序的,至于怎么排序的,是由排序的算法決定的。
策略模式由三部分組成:抽象策略角色,具體策略角色,環(huán)境角色。
抽象策略角色:策略類,通常由一個(gè)接口或者抽象類實(shí)現(xiàn)。
具體策略角色:實(shí)現(xiàn)了抽象策略類,并包裝了相關(guān)的算法和行為。
環(huán)境角色:持有一個(gè)策略類的引用,最終給客戶端調(diào)用。
下面提供一個(gè)簡單的策略模式的代碼實(shí)例:
1.抽象策略角色:定義一個(gè)接口strategy。
1
2
3
4
5
6
7
8
9
|
package com.test; /** * 策略模式抽象角色 * @author zhouwen * */ public interface strategy { public int calculate( int a, int b); } |
2.具體策略角色:實(shí)現(xiàn)strategy接口。例子中是實(shí)現(xiàn)加減乘除的運(yùn)算。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package com.test; /** * 策略模式具體策略類 * 實(shí)現(xiàn)加法運(yùn)算 * @author zhouwen * */ public class addstrategy implements strategy { @override public int calculate( int a, int b) { return a + b; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package com.test; /** * 策略模式具體策略類 * 實(shí)現(xiàn)減法運(yùn)算 * @author zhouwen * */ public class subtractstrategy implements strategy { @override public int calculate( int a, int b) { return a - b; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package com.test; /** * 策略模式具體策略類 * 實(shí)現(xiàn)乘法運(yùn)算 * @author zhouwen * */ public class multiplystragety implements strategy { @override public int calculate( int a, int b) { return a * b; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package com.test; /** * 策略模式具體策略類 * 實(shí)現(xiàn)除法運(yùn)算 * @author zhouwen * */ public class dividestrategy implements strategy { @override public int calculate( int a, int b) { return a / b; } } |
3.環(huán)境角色:在環(huán)境角色中定義一個(gè)抽象角色的引用,并暴露出計(jì)算的方法,供客戶端調(diào)用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package com.test; /** * 策略模式環(huán)境類 * @author zhouwen * */ public class environment { private strategy strategy; public environment(strategy strategy){ this .strategy = strategy; } //用以改變策略 public void setstrategy(strategy strategy){ this .strategy = strategy; } public strategy getstrategy(){ return strategy; } //暴露計(jì)算的接口,供客戶端調(diào)用 public int calculate( int a, int b){ return strategy.calculate(a, b); } } |
4.最后編寫客戶端的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package com.test; public class client { public static void main(string[] args) { addstrategy addstrategy = new addstrategy(); environment environment = new environment(addstrategy); system.out.println(environment.calculate( 3 , 4 )); subtractstrategy substrategy = new subtractstrategy(); environment.setstrategy(substrategy); system.out.println(environment.calculate( 3 , 4 )); multiplystragety multiplystrategy = new multiplystragety(); environment.setstrategy(multiplystrategy); system.out.println(environment.calculate( 3 , 4 )); dividestrategy dividestrategy = new dividestrategy(); environment.setstrategy(dividestrategy); system.out.println(environment.calculate( 3 , 4 )); } } |
總結(jié):
由客戶端的system.out.println(environment.calculate(3, 4));
這句代碼,我們并不知道具體調(diào)用的是哪個(gè)實(shí)現(xiàn)類,只有知道了傳給環(huán)境角色的具體策略類我們才知道調(diào)用哪個(gè)類,這樣就能實(shí)現(xiàn)客戶端和具體策略算法的分離,使程序易于切換、易于理解、易于擴(kuò)展。
策略模式的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
1.策略模式的用意是針對一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中,從而使得他們可以相互替換。如提供的例子中通過set方法對策略進(jìn)行替換。
2.策略模式使得算法可以在不影響客戶端的情況下發(fā)生變化。使用策略模式可以把行為和環(huán)境分隔開。
3.環(huán)境類負(fù)責(zé)維持和查詢行為類,各類算法則在具體策略中提供。由于算法和環(huán)境獨(dú)立開來,算法的修改不會(huì)影響環(huán)境和客戶端。
缺點(diǎn):
1.客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。
2.會(huì)造成很多的策略類。
希望本文所述對大家java程序設(shè)計(jì)有所幫助。
原文鏈接:https://blog.csdn.net/zw19910924/article/details/41556493