Java設(shè)計模式之策略模式原理與用法實例詳解
本文實例講述了Java設(shè)計模式之策略模式原理與用法。分享給大家供大家參考,具體如下:
策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。其中JDK里面的TreeSet類和TreeMap類就用到了策略模式。這兩個類是帶排序的集合類,其中排序的規(guī)則就相當于策略模式里定義的一系列算法,而集合類就相當于是策略模式里的環(huán)境類,供用戶使用,用只知道TreeSet和TreeMap是帶排序的,至于怎么排序的,是由排序的算法決定的。
策略模式由三部分組成:抽象策略角色,具體策略角色,環(huán)境角色。
抽象策略角色:策略類,通常由一個接口或者抽象類實現(xiàn)。
具體策略角色:實現(xiàn)了抽象策略類,并包裝了相關(guān)的算法和行為。
環(huán)境角色:持有一個策略類的引用,最終給客戶端調(diào)用。
下面提供一個簡單的策略模式的代碼實例:
1.抽象策略角色:定義一個接口Strategy。
package com.test;
/**
* 策略模式抽象角色
* @author zhouwen
*
*/
public interface Strategy {
public int calculate(int a, int b);
}
2.具體策略角色:實現(xiàn)Strategy接口。例子中是實現(xiàn)加減乘除的運算。
package com.test;
/**
* 策略模式具體策略類
* 實現(xiàn)加法運算
* @author zhouwen
*
*/
public class AddStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a + b;
}
}
package com.test;
/**
* 策略模式具體策略類
* 實現(xiàn)減法運算
* @author zhouwen
*
*/
public class SubtractStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a - b;
}
}
package com.test;
/**
* 策略模式具體策略類
* 實現(xiàn)乘法運算
* @author zhouwen
*
*/
public class MultiplyStragety implements Strategy {
@Override
public int calculate(int a, int b) {
return a * b;
}
}
package com.test;
/**
* 策略模式具體策略類
* 實現(xiàn)除法運算
* @author zhouwen
*
*/
public class DivideStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a / b;
}
}
3.環(huán)境角色:在環(huán)境角色中定義一個抽象角色的引用,并暴露出計算的方法,供客戶端調(diào)用。
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;
}
//暴露計算的接口,供客戶端調(diào)用
public int calculate(int a, int b){
return strategy.calculate(a, b);
}
}
4.最后編寫客戶端的代碼:
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)用的是哪個實現(xiàn)類,只有知道了傳給環(huán)境角色的具體策略類我們才知道調(diào)用哪個類,這樣就能實現(xiàn)客戶端和具體策略算法的分離,使程序易于切換、易于理解、易于擴展。
策略模式的優(yōu)缺點:
優(yōu)點:
1.策略模式的用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得他們可以相互替換。如提供的例子中通過set方法對策略進行替換。
2.策略模式使得算法可以在不影響客戶端的情況下發(fā)生變化。使用策略模式可以把行為和環(huán)境分隔開。
3.環(huán)境類負責維持和查詢行為類,各類算法則在具體策略中提供。由于算法和環(huán)境獨立開來,算法的修改不會影響環(huán)境和客戶端。
缺點:
1.客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。
2.會造成很多的策略類。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計入門與進階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
升級dubbo2.7.4.1版本平滑遷移到注冊中心nacos
這篇文章主要為大家介紹了2.7.4.1的dubbo平滑遷移到注冊中心nacos的兩種版本升級方案,以及為什要升級,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02
Java實現(xiàn)簡易版聯(lián)網(wǎng)坦克對戰(zhàn)小游戲(附源碼)
這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)簡易版聯(lián)網(wǎng)坦克對戰(zhàn)小游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-04-04

