策略模式
1、簡介
策略模式作為一種軟體設計模式,指物件有某個行為,但是在不同的場景中,該行為有不同的實作演算法,比如對于上班族來說,每周都會去公司上班,那么我們去公司的方式有多種多樣,比如我們可以選擇步行,騎單車,開車或者坐公交車等,再比如我們的高德導航系統,在提供導航服務的時候會根據客戶需求的不同提供相應的導航策略,比如步行導航,開車導航等,下面看一個關于策略模式的類圖

2、應用場景
應用場景:
1、 多個類只區別在表現行為不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行為,
2、 需要在不同情況下使用不同的策略(演算法),或者策略還可能在未來用其它方式來實作,
3、 對客戶隱藏具體策略(演算法)的實作細節,彼此完全獨立,
3、優缺點
優點
- 演算法可以自由切換
- 避免使用多重條件判斷(如果不用策略模式我們可能會使用多重條件陳述句,不利于維護)
- 擴展性良好,增加一個策略只需實作介面即可
缺點
- 策略類數量會增多,每個策略都是一個類,復用的可能性很小
- 所有的策略類都需要對外暴露
4、具體實作
? 下面就寫一個簡單的去公司上班的demo來加以說明
1.策略角色
/**
*
* 定義行為或者功能,在這里我的行為就是去公司,每個策略或演算法必須具有的方法和屬性
*/
public abstract class Strategy {
//去公司
abstract void gotoCompany();
}
2.背景關系Context
/**
*
* Context背景關系角色,或者Context封裝角色,屏蔽高層模塊對策略、演算法的直接訪問,封裝可能存在的變化
*/
public class Context {
//持有策略的參考
private Strategy strategy;
public Context() {
this.strategy = null;
}
//靈活配置策略
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
//根據不同的策略呼叫不同的行為
public void contextInterface() {
strategy.gotoCompany();
}
}
3.具體策略角色
/**
*
* 步行去公司
*/
public class Walk extends Strategy{
@Override
void gotoCompany() {
System.out.println("今天天氣好我步行去公司");
}
}
/**
*
* 開車去公司
*/
public class Drive extends Strategy {
@Override
void gotoCompany() {
System.out.println("今天下雨我開車去公司");
}
}
4. Client客戶端
在這里我們可以根據需要選擇不同的策略,也就是暴露給用戶可選的策略
public class Client {
public static void main(String[] args) {
Context context = new Context();
//配置具體策略
context.setStrategy(new Drive());
//行為或功能
context.contextInterface();
//配置具體策略
context.setStrategy(new Walk());
//行為或功能
context.contextInterface();
}
}
5. 測驗結果列印

初次學習,歡迎大家批評指正,謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/415313.html
標籤:設計模式
