策略模式屬於三種類型設計模式中的行爲模式(另外兩種是建立型模式和結構型模式)
java
策略模式定義了算法家族,分別封裝起來,讓他們之間能夠互相替換,此模式讓算法的變化不會影響到使用算法的客戶。算法
該模式通常須要定義一個父類(算法類),定義該類要實現業務的抽象方法(計算返回結果),而後定義N個子類去實現該方法,經過上下文類(context)聲明一個該父類的成員,建立上下文的時候根據傳入的string用生成子類賦到父類成員上,再在上下文類中聲明一個方法,方法中調用業務方法便可.設計模式
應用場景:1.以不一樣格式保存文件;2.以不一樣算法壓縮文件。3.以不一樣算法截獲圖像。4.以不一樣格式輸出一樣數據的圖形,如曲線或框圖等ide
缺點:下述代碼暴露給客戶端的有Context,celve,celve的子類,耦合性很高;每增長一個策略就要多寫一個子類。測試
優勢:完美支持開放-封閉原則,里氏替換原則和單一職責原則。
this
package com.me.celvemoshi.test; /** * 工場模式是經過工場new出來一個Celve 而策略模式是經過上下文傳遞,直接在上下文中建立聲明一個Celve,並經過構造方法把Celve穿進去, * 最後調用相應的方法 * * @author liujun E-mail: * @version 建立時間:2016年2月21日 下午5:22:23 */ public class CelveTest { public static void main(String[] args) { // 客戶端調用 Context context; context = new Context(new DazheCelve(0.8)); System.out.println(context.getResult(110d)); context = new Context(new FanliCelve(300d, 100d)); System.out.println(context.getResult(400d)); context = new Context(new FanliCelve(300d, 100d)); } } class Context { Celve celve; public Context(Celve celve) { this.celve = celve; } public double getResult(Double money) { return celve.getResult(money); } } abstract class Celve { public abstract double getResult(Double money); } /** * 打折 * * @author 58 * */ class DazheCelve extends Celve { private double rate; public DazheCelve(double rate) { this.rate = rate; } public double getRate() { return rate; } public void setRate(double rate) { this.rate = rate; } @Override public double getResult(Double money) { return money * rate; } } /** * 打折並滿減 * * @author */ class DazheAndFanli extends Celve { private double rate; private double moneyLimit; private double moneyReturn; public DazheAndFanli(double rate, double moneyLimit, double moneyReturn) { this.rate = rate; this.moneyLimit = moneyLimit; this.moneyReturn = moneyReturn; } @Override public double getResult(Double money) { double tempResult = money * rate; if (tempResult >= moneyLimit) { tempResult -= moneyReturn; } return tempResult; } public double getRate() { return rate; } public void setRate(double rate) { this.rate = rate; } public double getMoneyLimit() { return moneyLimit; } public void setMoneyLimit(double moneyLimit) { this.moneyLimit = moneyLimit; } public double getMoneyReturn() { return moneyReturn; } public void setMoneyReturn(double moneyReturn) { this.moneyReturn = moneyReturn; } } /** * 滿減 * * @author 58 * */ class FanliCelve extends Celve { private double moneyLimit; private double moneyReturn; public FanliCelve(double moneyLimit, double moneyReturn) { this.moneyLimit = moneyLimit; this.moneyReturn = moneyReturn; } public double getMoneyLimit() { return moneyLimit; } public void setMoneyLimit(double moneyLimit) { this.moneyLimit = moneyLimit; } public double getMoneyReturn() { return moneyReturn; } public void setMoneyReturn(double moneyReturn) { this.moneyReturn = moneyReturn; } @Override public double getResult(Double money) { if (money > moneyLimit) { money = money - moneyReturn; } return money; } }