一、模式介紹
策略模式(Strategy Pattern):定義一系列算法,將每一個算法封裝起來,並讓它們可以相互替換。
策略模式讓算法獨立於使用它的客戶而變化,也稱爲政策模式(Policy)。
策略模式是一種對象行爲型模式。
二、模式結構
三、模式代碼
1、抽象策略接口
package com.example.demo.strategy;
//策略接口
public interface Strategy {
public String doScheme(String name,String scheme);
}
2、具體策略美人計
package com.example.demo.strategy;
//美人計
public class Beauty implements Strategy{
@Override
public String doScheme(String name,String scheme) {
String all = scheme+" "+"eg:"+name;
return "美人計:" + all;
}
}
3、具體策略苦肉計
package com.example.demo.strategy;
//苦肉計
public class BitterMeat implements Strategy{
@Override
public String doScheme(String name,String scheme) {
String all = scheme+" "+"eg:"+name;
return "苦肉計:" + all;
}
}
4、具體策略空城計
package com.example.demo.strategy;
//空城計
public class EmptyCity implements Strategy{
public String doScheme(String name,String scheme) {
String all = scheme+" "+"eg:"+name;
return "空城計:" + all;
}
}
5、創建上下文
package com.example.demo.strategy;
//上下文
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public String executeStrategy(String name,String scheme){
return strategy.doScheme(name, scheme);
}
}
6、 模擬調用各策略
package com.example.demo.strategy;
//調用策略
public class Main {
public static void main(String[] args) {
Context context = new Context(new EmptyCity());
System.out.println(context.executeStrategy("諸葛亮",
"虛而示虛的疑兵之計,是一種疑中生疑的心理戰,多用於己弱而敵強的情況。"));
context = new Context(new BitterMeat());
System.out.println(context.executeStrategy("三十六計",
"自己傷害自己,以矇騙他人,從而達到預先設計好的目標。"));
context = new Context(new Beauty());
System.out.println(context.executeStrategy("王允,貂蟬之義父",
"它是利用色情、出賣肉體的方法,以女性勾引男性對象,以男性勾引女性對象,進行間諜情報活動。"));
}
}
7、打印結果
四、使用情景
完成一項任務,往往可以有多種不同的方式,每一種方式稱爲一個策略,我們可以根據環境或者條件的不同選擇不同的策略來完成該項任務。
1、諸葛亮的錦囊妙計,每一個錦囊就是一個策略。
2、旅行的出遊方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略。
3、登錄認證,現在需要登錄linux、Windows、mac、認證數據庫。每種認證方式可以封裝一個策略。
五、優缺點
優點: 1、算法可以自由切換。 2、避免使用多重條件判斷。 3、擴展性良好。
缺點: 1、客戶端必須知道所有策略類,並自行決定使用哪一種策略類。2、如果算法較多,則會造成很多的策略類。
六、demo地址
https://github.com/tongyuxin1/designModel/tree/master/src/main/java/com/example/demo