JAVA设计模式-策略模式

概念

在策略模式中,创建表示策略的对象Strategy和一个行为随着策略对象改变而改变的Context 对象。

  • Context:持有抽象策略接口的引用
  • Strategy:定义了算法的公共接口
  • ConcreteStrategy:定义具体的算法



例子:

模拟一个超市商品打折活动的场景,定义抽象的策略接口

public interface CashSuper {
    double getCash(double price, int number);
}

正常销售

/**
 * 正常
 *
 */
public class CashNormal implements CashSuper{
    @Override
    public double getCash(double price, int number) {
        return price * number;
    }
}

满200减100

/**
 * 满200减100
 */
public class CashReturn implements CashSuper{
    @Override
    public double getCash(double price, int number) {
        double totalPrice = price * number;
        if(totalPrice >= 200){
            return totalPrice - 100;
        }else {
            return totalPrice;
        }
    }
}

打八折

/**
 * 打八折
 *
 */
public class CashRate implements CashSuper{

    @Override
    public double getCash(double price, int number) {
        return price * number * 0.8;
    }
}

收银员根据具体的活动找零

public class Cashier {
    private CashSuper cashSuper;

    public Cashier(CashSuper cashSuper){
        this.cashSuper = cashSuper;
    }

    public double handle(double price, int number){
        return cashSuper.getCash(price, number);
    }
}

客户端

public class Test {
    public static void main(String args[]) {
        double price = 30;
        int number = 10;

        Cashier cashier = new Cashier(new CashReturn());
        System.out.println("找零:" + cashier.handle(price, number));


        cashier = new Cashier(new CashNormal());
        System.out.println("找零:" + cashier.handle(price, number));


        cashier = new Cashier(new CashRate());
        System.out.println("找零:" + cashier.handle(price, number));
    }
}

优点:

  • 增加新的策略,只需要实现抽象接口即可,体现了对修改关闭,对扩展开放的原则。
  • 避免了多重的if-else判断

缺点:

  • 客户端需要知道所有的策略
  • 随着策略的增加,具体的策略类数量会越来越多
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值