時光荏苒,歲月如梭,不知不覺2020就這么過去了。新的一年,預祝大家心想事成、身體健康。
基本介紹
策略模式是行為型設計模式的一種。
策略模式的核心思想是:定義算法族(可以理解為多組算法、行為),將其分別封裝起來,并且確保他們之間可以相互替換。這樣做可以將算法的變化獨立于使用算法的用戶。
可能通過這些專業的術語還是不太好理解什么是策略模式。那么我打個比方:中午了要去吃飯了,我們可以選擇米飯、面條、水餃、炒餅等等……這其中的每一個食物我們都可以將其看作是一個策略。
策略模式中體現出了三個設計原則:
1、將變化的代碼從不變的代碼中分離出來。
2、面向接口編程。
3、盡可能地少使用繼承,可以使用組合和聚合替代。
策略模式UML類圖
類圖講解
Strategy:策略接口,抽象出了相關方法。
ConcreteStrategyA/B:具體策略類,實現了策略接口。
Context:環境對象,類中聚合了策略接口。
Client:客戶端測試類。
案例講解
案例:通過策略模式實現運動員通過不同方式進行游泳。
游泳行為接口 => 策略接口
public interface SwimBehavior {
// 游泳
void swim();
}
具體游泳行為
/**
* 仰泳
*/
public class Backstroke implements SwimBehavior {
@Override
public void swim() {
System.out.println("正在進行仰泳!");
}
}
/**
* 蛙泳
*/
public class Breaststroke implements SwimBehavior {
@Override
public void swim() {
System.out.println("正在進行蛙泳!");
}
}
/**
* 潛泳
*/
public class Diving implements SwimBehavior {
@Override
public void swim() {
System.out.println("正在進行潛泳!");
}
}
游泳運動員 => 對應Context角色
public class Swimmers {
// 游泳行為接口
private SwimBehavior swimBehavior;
// 運動員姓名
private String name;
// 構造方法
public Swimmers(SwimBehavior swimBehavior) {
this.swimBehavior = swimBehavior;
}
// 游泳
public void swim() {
System.out.print("比賽開始,運動員:" + name);
swimBehavior.swim();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
客戶端測試類
public class Client {
public static void main(String[] args) {
Swimmers swimmers = new Swimmers(new Backstroke());
swimmers.setName("編程小菜鳥");
swimmers.swim();
}
}
執行結果
總結
1、使用策略模式的關鍵在于學會分析項目中變化和不變的部分。
2、使用策略模式可以促使代碼變得更加有彈性、易于擴展、易于維護。
3、策略模式符合開閉原則,當需要新增行為時只需添加一種策略即可。
4、策略模式的缺點是當策略過多時會導致類的數量龐大。
今天的分享就到這里了,如果感覺“菜鳥”寫的文章還不錯,記得點贊、轉發加關注呦!你們的支持就是我堅持下去的動力。文章哪里寫的有問題的也希望大家可以指出,我會虛心受教。