1. 程式人生 > >設計模式練習(19)——策略模式

設計模式練習(19)——策略模式

策略模式

一、題目:

設計一個網上書店,該系統中所有的計算機圖書(ComputerBook),每本都有10%的折扣;所有的語言類圖書(LanguageBook),每本有2元的折扣;小說類圖書以每100元有10元的折扣,用策略模式設計該系統
(1)繪製策略模式結構檢視
(2)給出例項類圖並實現程式碼

二、所用模式結構檢視:

這裡寫圖片描述

三、例項類圖:

這裡寫圖片描述

四、例項實現程式碼:

(因為區分,所以在類的前面加了Gj19)

策略介面

package gjStrategyPattern;

/**
 * 策略介面
 * @author gong
 *
 */
public interface
Gj19BookStrategy {
double calPrice(double price); }

計算機書籍打折策略

package gjStrategyPattern;
/**
 * 計算機書籍打折策略
 * @author gong
 *
 */
public class Gj19ComputerStrategy implements Gj19BookStrategy{
    /**
     * 具體的打折策略
     */
    @Override
    public double calPrice(double price) {
        System.out.println("所有的計算機圖書 每本都有10%的折扣"
); return price*0.9D; } public Gj19ComputerStrategy() { } }

語言書籍打折策略類

package gjStrategyPattern;

/**
 * 語言書籍打折策略類
 * @author gong
 *
 */
public class Gj19LanguageStrategy implements Gj19BookStrategy{

    /**
     * 每本書減去2元
     */
    @Override
    public double calPrice(double
price) { System.out.println("語言類圖書 每本有2元的折扣"); return price-2.0D; } public Gj19LanguageStrategy() { } }

小說的打折策略類

package gjStrategyPattern;

/**
 * 小說的打折策略類
 * 
 * @author gong
 *
 */
public class Gj19NovelStrategy implements Gj19BookStrategy {

    @Override
    public double calPrice(double price) {
        System.out.println("小說類圖書以每100元有10元的折扣");
        int p = (int) price;
        return price-(double)(p/100*10);
    }

    public Gj19NovelStrategy() {
    }
}

計算價格的類

package gjStrategyPattern;

/**
 * 計算價格的類
 * @author gong
 *
 */
public class Gj19Price {
    /**
     * 建立抽象的策略模式
     */
    private Gj19BookStrategy bookStrategy;

    public Gj19Price(Gj19BookStrategy bookStrategy){
        this.bookStrategy = bookStrategy;
    }

    public double sum(double price){
        return this.bookStrategy.calPrice(price);
    }

}

策略模式客戶端

package gjStrategyPattern;

/**
 * 策略模式客戶端
 * @author gong
 *
 */
public class Client {
    //呼叫計算機書籍的打折策略
    public static void main(String[] args) {
        //定義具體的打折策略
        Gj19ComputerStrategy computerStrategy = new Gj19ComputerStrategy();
        Gj19LanguageStrategy gj19LanguageStrategy = new Gj19LanguageStrategy();
        Gj19NovelStrategy gj19NovelStrategy = new Gj19NovelStrategy();  
        //原價 折後價
        double price = 520.0D;
        double discountPrice;   
        //計算機書籍打折策略
        System.out.println("========================計算機書籍打折策略=======================");
        System.out.println("打折前的價格為:"+price);
        discountPrice = new Gj19Price(computerStrategy).sum(price);
        System.out.println("打折後的價格為:"+discountPrice);
        System.out.println("================================================================"); 
        //語言書籍打折策略
        System.out.println("=========================語言書籍打折策略========================");
        System.out.println("打折前的價格為:"+price);
        discountPrice = new Gj19Price(gj19LanguageStrategy).sum(price);
        System.out.println("打折後的價格為:"+discountPrice);
        System.out.println("================================================================");
        //小說書籍打折策略
        System.out.println("==========================小說書籍打折策略=======================");
        System.out.println("打折前的價格為:"+price);
        discountPrice = new Gj19Price(gj19NovelStrategy).sum(price);
        System.out.println("打折後的價格為:"+discountPrice);
    }
}

五、執行結果:

這裡寫圖片描述