一天一種設計模式之一-----策略模式

一.策略模式定義

  1. 策略模式屬於三種類型設計模式中的行爲模式(另外兩種是建立型模式和結構型模式)
    java

  2. 策略模式定義了算法家族,分別封裝起來,讓他們之間能夠互相替換,此模式讓算法的變化不會影響到使用算法的客戶。算法

  3. 該模式通常須要定義一個父類(算法類),定義該類要實現業務的抽象方法(計算返回結果),而後定義N個子類去實現該方法,經過上下文類(context)聲明一個該父類的成員,建立上下文的時候根據傳入的string用生成子類賦到父類成員上,再在上下文類中聲明一個方法,方法中調用業務方法便可.設計模式

  4. 應用場景:1.以不一樣格式保存文件;2.以不一樣算法壓縮文件。3.以不一樣算法截獲圖像。4.以不一樣格式輸出一樣數據的圖形,如曲線或框圖等ide

  5. 缺點:下述代碼暴露給客戶端的有Context,celve,celve的子類,耦合性很高;每增長一個策略就要多寫一個子類。測試

  6. 優勢:完美支持開放-封閉原則,里氏替換原則和單一職責原則。
    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;
    }

}
相關文章
相關標籤/搜索