設計模式_改進策略模式_策略模式與簡單工廠模式結合(Java)

上一篇我們介紹了《設計模式_策略模式(Java)》,同時講述了策略模式與狀態模式的區別,如果仔細查看代碼或者類圖,我們會發現策略模式在一定程度上是存在缺陷的,Client(Test類)必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味着Client必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用於Client知道所有的算法或行爲的情況。

這個改進版的就不放類圖了,相信你可以想象出來。

//package com.dlut.designpattern.strategy.advanced;

abstract class MarketStrategy {
    public abstract void discount();
}

class NormalPay extends MarketStrategy{
    @Override
    public void discount() {
        System.out.println("不打折,正常價.");
    }   
}

class DiscountPay extends MarketStrategy{
    @Override
    public void discount() {
        System.out.println("有折扣,打8折.");
    }
}

class CashBackPay extends MarketStrategy{
    @Override
    public void discount() {
        System.out.println("有返現,返100.");
    }   
}

class CustomContext{
    //簡單工廠模式,注意此處與上一篇策略模式Blog中寫法的區別
    //此處我們進行了解耦
    public MarketStrategy consumeCash(int consume){
        if(consume>=1000){
            return new CashBackPay();
        }else if(consume<1000 && consume>=500){
            return new DiscountPay();
        }else{
            return new NormalPay();
        }
    }
    public void pay(MarketStrategy m){
        m.discount();
    }
}

測試類:

//package com.dlut.designpattern.strategy.advanced;

public class Test {
    public static void main(String[] args) {
        CustomContext c=new CustomContext();
        c.pay(c.consumeCash(100));
        c.pay(c.consumeCash(600));
        c.pay(c.consumeCash(1100));
    }
}

輸出結果:

不打折,正常價.
有折扣,打8折.
有返現,返100.

是不是又學到了代碼中的精妙之處,不禁感嘆,還是要好好學習,天天向上。^_^

參考:

發佈了52 篇原創文章 · 獲贊 35 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章