设计模式_改进策略模式_策略模式与简单工厂模式结合(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.

是不是又学到了代码中的精妙之处,不禁感叹,还是要好好学习,天天向上。^_^

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值