目錄
- 1、項目需求
- 2、傳統方案解決鴨子問題的分析和代碼實現
- 3、傳統方式實現存在的問題分析和解決方案
- 4、策略模式基本介紹
- 5、使用策略模式解決鴨子問題
- 6、策略模式的注意事項和細節
- 7、策略模式的使用場景
以具體項目來演示為什么需要策略模式,策略模式的優點,以及策略模式使用過程中需要注意的問題
1、項目需求
- 有各種有鴨子(野鴨、北京鴨子、烤鴨),鴨子有各種行為(飛、叫),但是各種鴨子的行為又不完全一樣
- 顯示鴨子信息
2、傳統方案解決鴨子問題的分析和代碼實現
1)傳統設計方案
設計一個抽象父類 duck , 定義各種行為,然后各種鴨子種類繼承該父類,重新行為方法
2)代碼實現
public abstract class Duck {public abstract void display();public void quack() {System.out.println("鴨子嘎嘎叫~~~");}public void swim() {System.out.println("鴨子會游泳~~~");}public void fly() {System.out.println("鴨子會飛翔~~~");}
}public class BjDuck extends Duck{@Overridepublic void display() {System.out.println("這是一直北京鴨子~~~~");}@Overridepublic void fly() {System.out.println("北京鴨子不能飛翔!!");}
}
3、傳統方式實現存在的問題分析和解決方案
1)存在的問題
不同子類的行為是不一樣的,所以每次定義一個子類就需要重寫父類的行為,導致代碼太耦合
2)解決方式
使用策略模式
4、策略模式基本介紹
策略模式:指對象有某個行為,但是在不同的場景中,該行為有不同的實現算法
策略模式體現了幾個原則:
- 把變化的代碼從不變的代碼中抽離出來
- 針對接口編程而不是類
- 多采用組合,聚合,少用繼承的模式
策略模式基本類圖:
5、使用策略模式解決鴨子問題
- 封裝行為接口,實現算法族
超類中放行為的接口對象,在子類中具體設定行為對象
1) 定義行為接口,行為接口的具體實現類
// 飛行行為
public interface FlyBehavior {void fly();
}public class NoflyBehavior implements FlyBehavior{@Overridepublic void fly() {System.out.println("不會飛");}
}public class GoodflyBehavior implements FlyBehavior{@Overridepublic void fly() {System.out.println("具備很好的飛行技能!!");}
}// 叫行為
public interface QuackBehavior {void quack();
}
public class NoQuackBehavior implements QuackBehavior {@Overridepublic void quack() {System.out.println("不能叫");}
}
public class GeGeQuackBehavior implements QuackBehavior{@Overridepublic void quack() {System.out.println("咯咯叫");}
}
2)超類中聚合行為接口
public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public abstract void display();public void fly() {flyBehavior.fly();}public void quack() {quackBehavior.quack();}
}
3)實現類中設置具體的行為對象
public class BjDuck extends Duck{public BjDuck() {this.flyBehavior = new BadflyBehavior();this.quackBehavior = new GeGeQuackBehavior();}@Overridepublic void display() {System.out.println("我叫做北京鴨子!!");}}
4)測試
public class Test {public static void main(String[] args) {BjDuck bjDuck = new BjDuck();bjDuck.display();bjDuck.fly();bjDuck.quack();}
}
6、策略模式的注意事項和細節
- 策略模式的關鍵是:分析項目中的變化和不變部分
- 核心思想:多使用組合,少使用繼承;用行為類進行組合,而不是行為的繼承
需要注意的是:每添加一個策略就要增加一個類,當策略過多時會導致類數目龐大!!!
7、策略模式的使用場景
https://blog.csdn.net/m4330187/article/details/121292879