前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java描述设计模式(22):策略模式

Java描述设计模式(22):策略模式

作者头像
知了一笑
发布2019-12-03 13:17:47
4450
发布2019-12-03 13:17:47
举报
文章被收录于专栏:知了一笑

一、生活场景

每年双十一,各大电商平台会推出不同的满减策略,当用户的消费金额满一定额度后,会进行减去一定的优惠额度,从而来一波清仓甩卖,使用策略模式来描述该流程。

代码语言:javascript
复制
public class C01_InScene {
    public static void main(String[] args) {
        // 选择满减策略,走相应的计算方式
        FullReduce strategy = new Full100 ();
        Payment price = new Payment(strategy);
        double quote = price.payment(300);
        System.out.println("最终价格为:" + quote);
    }
}
/**
 * 付款
 */
class Payment {
    private FullReduce fullReduce ;
    public Payment (FullReduce fullReduce){
        this.fullReduce = fullReduce ;
    }
    public double payment (double totalPrice){
        return this.fullReduce.getPayMoney(totalPrice) ;
    }
}
/**
 * 金额满减接口
 */
interface FullReduce {
    double getPayMoney (double totalPrice) ;
}
/**
 * 不同的满减策略
 */
class Full100 implements FullReduce {
    @Override
    public double getPayMoney(double totalPrice) {
        if (totalPrice >= 100){
            totalPrice = totalPrice-20.0 ;
        }
        return totalPrice ;
    }
}
class Full500 implements FullReduce {
    @Override
    public double getPayMoney(double totalPrice) {
        if (totalPrice >= 500){
            totalPrice = totalPrice-120.0 ;
        }
        return totalPrice ;
    }
}

二、策略模式

1、基础概念

策略模式属于对象的行为模式。策略模式中定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客 户端。

2、模式图解

3、核心角色

  • 环境角色

持有一个Strategy策略接口角色的引用。

  • 抽象策略角色

通常由一个接口或抽象类实现。此角色给出所有的具体策略类要实现的接口。

  • 具体策略角色

包装相关的算法或业务流程。

4、源码实现

代码语言:javascript
复制
public class C02_Strategy {
    public static void main(String[] args) {
        Strategy strategy = new ConcreteStrategyB() ;
        Context context = new Context(strategy) ;
        context.userMethod();
    }
}
/** 环境角色类 */
class Context {
    //持有一个具体策略的对象
    private Strategy strategy;
    /**
     * 构造函数,传入一个具体策略对象
     * @param strategy    具体策略对象
     */
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    public void userMethod (){
        this.strategy.strategyMethod();
    }
}
/** 抽象策略类 */
interface Strategy {
    // 策略方法
    void strategyMethod () ;
}
/** 具体策略类 */
class ConcreteStrategyA implements Strategy {
    @Override
    public void strategyMethod() {
        System.out.println("策略A方法");
    }
}
class ConcreteStrategyB implements Strategy {
    @Override
    public void strategyMethod() {
        System.out.println("策略B方法");
    }
}

三、策略模式总结

策略模式的关键是:变化的与不变分离,体现了“对修改关闭,对扩展开放”原则。客户端增加行为不用修改原有代码,只要添加一种策略即可,易于切换、易于理解、易于扩展。策略过多是会导致类数目庞大,变得难以维护。

四、源代码地址

代码语言:javascript
复制
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 知了一笑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、生活场景
  • 二、策略模式
    • 1、基础概念
      • 2、模式图解
        • 3、核心角色
          • 4、源码实现
          • 三、策略模式总结
          • 四、源代码地址
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档