一起學設計模式-策略模式
阿新 • • 發佈:2018-11-25
一、模式介紹
策略模式(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