Strategy Pattern enables selecting an algorithm at runtime.
In more detail, code receives run-time instructions as to which in a family of algorithms to use.
策略模式—— 定義了演算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化獨立于使用演算法的客戶,
策略模式:使得具有共性的一組演算法獨立于呼叫方,
隱喻(Metaphor):
在足球場上踢球時需要帶一把扳手??去踢球,但是正真見到對方球員時感覺扳手沒什么大用需要回傳到休息室換成一個狼牙棒,也許一個人來來回回浪費不了多少人力物力但是如果整個球隊這樣做就太費力氣了,
這時可以想象一個空間足夠大可以隨身攜帶的箱子里面放置足以滿足整個球隊需要的“工具“,在球場上根據對方的球員在身邊的箱子里選擇相應的工具這樣整個操作更加靈活快捷!
**箱子的工具(共性:“應對”對方球員的工具) ===》 不同的演算法**
**箱子 ===》 演算法的組合場所**
**己方球員 ===》 演算法的呼叫者**
**對方球員 ===》 客戶端的不同請求**
設計原則:
- 面向介面編程而非面向實作;
- 使用組合而非繼承;
- 在系統之中找到一組具有共性的變化,將其獨立出來;
好處:
在策略模式中,行為被定義為單獨的介面和實作這些介面的特定類,
這樣可以在行為與使用行為的類之間實作更好的解耦,
可以在不破壞使用行為的類的情況下更改行為,并且這些類可以通過更改所使用的特定實作在行為之間進行切換,而無需進行任何重大的代碼更改,
例子:

例子代碼實作:
1- interface: ShotMethod.java
package ink.openmind.pattern.strategypattern.demo03;
public interface ShotMethod {
String shot();
}
2-Class: ManualSingleShotting.java
package ink.openmind.pattern.strategypattern.demo03;
public class ManualSingleShotting implements ShotMethod {
@Override
public String shot() {
// TODO Auto-generated method stub
String shotInfo = "?? 射擊方式:手動單點射擊??";
return shotInfo;
}
}
3-Class: ThreeRoundBurstShotting.java
package ink.openmind.pattern.strategypattern.demo03;
public class ThreeRoundBurstShotting implements ShotMethod {
@Override
public String shot() {
// TODO Auto-generated method stub
String shotInfo = "?? 射擊方式:三發點放射擊??????";
return shotInfo;
}
}
4-Abstract Class: Gun.java
package ink.openmind.pattern.strategypattern.demo03;
public abstract class Gun {
protected ShotMethod shotMethod;
public abstract String originDisplay();
public ShotMethod getShotMethod() {
return shotMethod;
}
public void setShotMethod(ShotMethod shotMethod) {
this.shotMethod = shotMethod;
}
public String performShot() {
return this.shotMethod.shot();
}
}
5-Class: AWPSniperRifle.java
package ink.openmind.pattern.strategypattern.demo03;
public class AWPSniperRifle extends Gun{
public AWPSniperRifle() {
super.shotMethod = new ManualSingleShotting();
}
@Override
public String originDisplay() {
// TODO Auto-generated method stub
String originInfo = "?? Made in UK(United Kingdom)";
return originInfo;
}
}
6-Class: M16A2Rifle.java
package ink.openmind.pattern.strategypattern.demo03;
public class M16A2Rifle extends Gun {
public M16A2Rifle() {
super.shotMethod = new ThreeRoundBurstShotting();
}
@Override
public String originDisplay() {
// TODO Auto-generated method stub
String originInfo = "?? Made in USA(United States of America)";
return originInfo;
}
}
7-Class: Test.java
package ink.openmind.pattern.strategypattern.demo03;
public class Test {
public static void main(String[] args) {
M16A2Rifle m16 = new M16A2Rifle();
// 初始射擊方式
System.out.println("M16A2 => " + m16.performShot());
// 切換射擊方式
m16.setShotMethod(new ManualSingleShotting());
// 更改之后的射擊方式
System.out.println("M16A2(切換射擊方式之后) =>: " + m16.performShot());
System.out.println("M16A2產地資訊: " + m16.originDisplay());
System.out.println("====================================");
AWPSniperRifle awp = new AWPSniperRifle();
// 初始射擊方式
System.out.println("AWP => " + awp.performShot());
System.out.println("AWP產地資訊:" + awp.originDisplay());
}
}
// 輸出
/*
M16A2 => ?? 射擊方式:三發點放射擊??????
M16A2(切換射擊方式之后) =>: ?? 射擊方式:手動單點射擊??
M16A2產地資訊: ?? Made in USA(United States of America)
====================================
AWP => ?? 射擊方式:手動單點射擊??
AWP產地資訊:?? Made in UK(United Kingdom)
*/
參考鏈接:
https://www.runoob.com/w3cnote/state-vs-strategy.html
https://zh.wikipedia.org/wiki/精密國際AWP狙擊步槍
https://en.wikipedia.org/wiki/Strategy_pattern
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/3113.html
標籤:設計模式
上一篇:設計模式(12) 代理模式
下一篇:設計模式 --單例模式
