本文源码:GitHub·点这里| | GitEE·点这里
一、生活场景
每年双十一,各大电商平台会推出不同的满减策略,当用户的消费金额满一定额度后,会进行减去一定的优惠额度,从而来一波清仓甩卖,使用策略模式来描述该流程。
<代码类="语言java ">公共类C01_InScene { 公共静态void main (String [] args) {//选择满减策略,走相应的计算方式 FullReduce策略=new Full100 (); 支付价格=new支付(策略); 双引号=price.payment (300); system . out。println(“最终价格为:" + "); } }/* * *付款 */类支付{ 私人FullReduce FullReduce; 公共支付(FullReduce FullReduce) { 这一点。fullReduce=fullReduce; } 公共支付两倍(双totalPrice) { 返回this.fullReduce.getPayMoney (totalPrice); } }/* * *金额满减接口 */接口FullReduce { 双getPayMoney(双totalPrice); }/* * *不同的满减策略 */类Full100实现FullReduce { @Override 公共双getPayMoney(双totalPrice) { 如果(totalPrice祝辞=100){ totalPrice=totalPrice - 20.0; } 返回totalPrice; } } 类Full500实现FullReduce { @Override 公共双getPayMoney(双totalPrice) { 如果(totalPrice祝辞=500){ totalPrice=totalPrice - 120.0; } 返回totalPrice; } }代码>
二、策略模式
1,基础概念
策略模式属于对象的行为模式。策略模式中定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户端。
引用>2,模式图解
3,核心角色
<李>环境角色李>
持有一个战略策略接口角色的引用。
引用><李>抽象策略角色李>
通常由一个接口或抽象类实现。此角色给出所有的具体策略类要实现的接口。
引用><李>具体策略角色李>
包装相关的算法或业务流程。
引用>4,源码实现
<代码类="语言java ">公共类C02_Strategy { 公共静态void main (String [] args) { 战略策略=new ConcreteStrategyB (); 上下文语境=new上下文(策略); context.userMethod (); } }/* *环境角色类*/类上下文{//持有一个具体策略的对象 私人战略策略;/* * *构造函数,传入一个具体策略对象 * @param策略具体策略对象 */公共环境(战略策略){ 这一点。策略=策略; } 公共空间userMethod () { this.strategy.strategyMethod (); } }/* *抽象策略类*/接口策略{//策略方法 空白strategyMethod (); }/* *具体策略类*/类ConcreteStrategyA实现策略{ @Override 公共空间strategyMethod () { System.out.println(“策略一方法”); } } 类ConcreteStrategyB实现策略{ @Override 公共空间strategyMethod () { System.out.println(“策略B方法”); } }代码>三、策略模式总结
策略模式的关键是:变化的与不变分离,体现了“对修改关闭,对扩展开放“原则。客户端增加行为不用修改原有代码,只要添加一种策略即可,易于切换,易于理解,易于扩展。策略过多是会导致类数目庞大,变得难以维护。
引用>四、源代码地址
<代码> GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent 代码>
Java描述设计模式(22):策略模式