策略模式屬於用處不少而且很簡單的一種設計模式web
在策略模式(Strategy Pattern)中,一個類的行爲或其算法能夠在運行時更改。這種類型的設計模式屬於行爲型模式。算法
策略模式中定義了算法家族,分別封裝起來,讓他們之間能夠相互替換,此模式讓算法的變化,不會影響到使用算法的客戶。小程序
咱們再來假設一個場景,根據不一樣的下訂單入口對用戶進行積分獎勵設計模式
app下單用戶 | web下單用戶 | 小程序下單用戶 |
---|---|---|
獎勵100積分 | 獎勵20積分 | 獎勵50積分 |
package design.pattern.reward;
public class Reward {
/**
* 下單平臺 0 web 1 小程序 2 app
*/
private int platform = 0;
public Reward(int platform) {
this.platform = platform;
}
/**
* 給用戶送積分
*/
public void giveScore() {
int score = 0;
switch (platform) {
case 0: //web
//todo
score = 20;
break;
case 1: //小程序
//todo
score = 50;
break;
case 2: //app
//todo
score = 100;
break;
}
System.out.println("送給用戶" + score + "分");
}
}
複製代碼
業務調用:bash
package design.pattern.reward;
public class PayNotify {
public static void main(String[] args) {
Reward reward = new Reward(2);
reward.giveScore();
}
}
複製代碼
當咱們的算法愈來愈多,愈來愈複雜的時候,而且當某個算法發生變化,將對全部其餘計算方式都會產生影響,不能有效的彈性、清晰的拓展,因此這個時候咱們的策略模式就上場了。app
1.首先接口聲明-抽象策略工具
package design.pattern.reward.score;
public interface InterfaceScore {
/**
* 送積分
*/
public void giveScore();
}
複製代碼
2.咱們實現接口的giveScore方法-實現具體策略算法ui
app端積分this
package design.pattern.reward.score;
public class AppScore implements InterfaceScore {
private int score = 100;
/**
* 送積分
*/
public void giveScore() {
//todo 具體算法邏輯
System.out.println("送你積分" + score);
}
}
複製代碼
web端積分:spa
package design.pattern.reward.score;
public class WebScore implements InterfaceScore {
private int score = 20;
/**
* 送積分
*/
public void giveScore() {
//todo 具體算法邏輯
System.out.println("送你積分" + score);
}
}
複製代碼
package design.pattern.reward;
import design.pattern.reward.score.InterfaceScore;
public class Context {
private InterfaceScore scoreObj;
public Context(InterfaceScore algorithmObj) {
this.scoreObj = algorithmObj;
}
public void giveScore() {
this.scoreObj.giveScore();
}
}
複製代碼
Context context1 = new Context(new AppScore());
context1.giveScore();
Context context2 = new Context(new WebScore());
context2.giveScore();
複製代碼
output:
送你積分100
送你積分20
複製代碼
好像跟咱們剛開始的調用方法不同,約定好的是傳一個type值來肯定計算的方法,如今直接將計算規則方法暴露給了調用方
package design.pattern.reward;
import design.pattern.reward.score.AppScore;
import design.pattern.reward.score.InterfaceScore;
import design.pattern.reward.score.WebScore;
public class Context {
private InterfaceScore scoreObj;
public Context(int platform) {
switch (platform) {
case 0: //web
this.scoreObj = new WebScore();
break;
case 1: //小程序
//todo
break;
case 2: //app
this.scoreObj = new AppScore();
break;
}
}
public void giveScore() {
this.scoreObj.giveScore();
}
}
複製代碼
調用:
Context context1 = new Context(0);
context1.giveScore();
Context context2 = new Context(2);
context2.giveScore();
複製代碼
是否是很簡單。。。
策略模式是一種定義一系列算法的方法,從概念上來看,全部這些算法完成的都是相同的工做,只是實現不一樣,他能夠以相同的方式調用全部的算法.減小了算法與使用算法之間的耦合.
策略模式是用來封裝算法的,但在實踐中咱們能夠用它來封裝幾乎任何類型的規則, 只要在分析過程當中須要在不一樣時間應用不一樣的業務規則,就能夠考慮使用策略模式處理這種變化的可能性。
模版方法模式使用了繼承方式實現算法,而策略模式使用了組合方式 模版方法模式對於算法擁有絕對的控制,而策略模式不對算法控制 模版方法的依賴程度要比策略模式高 。。。。。
更多精彩內容關注呆呆公衆號: