策略模式的使用

假设有这样一种情况,有这个客户群体,小客户小批量,小客户大批量,大客户小批量,大客户大批量,针对不同的客户对价格进行打折,常用的写法可能会这样写:

public class PriceStrategy {

    public double getPrice(String type, double price) {
        double realPrice = 0;
        if (type.equals("小客户小批量")) {
            realPrice = price * 1;
        } else if (type.equals("小客户大批量")) {
            realPrice = price * 0.9;
        } else if (type.equals("大客户小批量")) {
            realPrice = price * 0.85;
        } else if (type.equals("大客户大批量")) {
            realPrice = price * 0.8;
        }
        return realPrice;
    }
}

这样写简单粗暴,但是这样写的坏处就是不方便扩展,比如我增加了一些新的客户群体或者打折的策略变了,都需要去修改已有的代码,不符合开闭原则,再者如果打折的算法是很复杂的,一次性写到一个类里面会非常臃肿。

我们可以采取策略模式来实现这种场景,策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决问题,同时可以方便的更换算法或者增加新的算法,并由客户端决定调用哪个哪个算法。

首先我们定义一个接口

public interface PriceInterface {
    double getPrice(double price);
}

然后写出这4种客户群体的实现类,不同的群体算法不一样

小客户小批量不打折

public class NewCusFewPriceStrategy implements PriceInterface {
    @Override
    public double getPrice(double price) {
        System.out.print("不打折");
        return price;
    }
}

小客户大批量打9折

public class NewCusManyPriceStrategy implements PriceInterface {
    @Override
    public double getPrice(double price) {
        System.out.print("打9折");
        return price * 0.9;
    }
}


大客户小批量打8.5折

public class OldCusFewPriceStrategy implements PriceInterface {
    @Override
    public double getPrice(double price) {
        System.out.print("打8.5折");
        return price*0.85;
    }
}

大客户大批量打8折

public class OldCusManyPriceStrategy implements PriceInterface {
    @Override
    public double getPrice(double price) {
        System.out.print("打8折");
        return price * 0.8;
    }
}

这样就实现了一个算法族,然后还要写一个管理类来统一调用这些实现类

public class Context {
    private PriceInterface mPriceStrategy;

    public Context(PriceInterface priceStrategy) {
        mPriceStrategy = priceStrategy;
    }
    
    public void printPrice(double price) {
        System.out.print("你的报价:" + mPriceStrategy.getPrice(price));
    }
}


最后在类里面的使用如下

public class ClientText {
    public static void main(String args[]) {
        OldCusManyPriceStrategy lOldCusManyPriceStrategy = new OldCusManyPriceStrategy();
        Context lContext = new Context(lOldCusManyPriceStrategy);
        lContext.printPrice(998);
    }
}

策略模式的核心是分离算法,选择实现。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值