设计模式——策略模式:会员价格体系的简单实现
2017-02-16 10:55
477 查看
前言
上面这张图是京东商城的会员体系,总共包含五种不同等级的会员,分别是注册会员,铜牌会员,银牌会员,黄金会员,钻石会员。从上图可以看出,不同等级会员享有不同的优惠服务,那么这么多优惠服务在程序中是怎么实现的呢?最直接了当的方式,就是写一堆if else去做判断,这显然不是最佳实现方式,很不利于后期维护。实际上这里需要用到设计模式中的策略模式,针对不同等级的会员,每一种会员特权都拒用不同的优惠策略。
策略模式
定义算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。策略模式结构原型
策略模式的组成
应用场景(Context):1、需要使用ConcreteStrategy提供的算法。
2、 内部维护一个Strategy的实例。
3、 负责动态设置运行时Strategy具体的实现算法。
4、负责跟Strategy之间的交互和数据传递。
抽象策略(StrategyInterface): 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
具体策略(Strategy):包装了相关的算法和行为。
具体应用场景
具体策略划分
我们现在来模仿京东会员机制,将会员分为三种等级:普通会员,金牌会员,钻石会员。以下为会员优惠服务,不同等级的会员拥有不同的优惠策略:优惠服务\会员等级 | 普通会员 | 黄金会员 | 钻石会员 |
会员特价 | 正常价 | 打九折 | 打九折 |
运费 | 5元 | 5元 | 包邮 |
会员策略模型
代码实现
抽象策略角色
会员接口:MemberInterface.javapackage strategy.member; /** * 会员接口 * @author vision */ public interface MemberInterface { /** * 会员价格 * @param price * @return */ public Double getPrice(Double price); /** * 是否包邮 * @return */ public boolean freeShipping(); }
具体策略角色
普通会员:NormalMember.javapackage strategy.member.impl; import strategy.member.MemberInterface; /** * 普通会员 * @author vision */ public class NormalMember implements MemberInterface{ /** * 会员价格,正常价 */ public Double getPrice(Double price) { //普通会员原价销售 return price; } /** * 不包邮 */ public boolean freeShipping() { //普通会员不包邮 return false; } }
黄金会员:GoldMember.java
package strategy.member.impl; import strategy.member.MemberInterface; /** * 黄金会员 * @author vision */ public class GoldMember implements MemberInterface{ /** * 会员价格,打九折 */ public Double getPrice(Double price) { return price*0.9; } /** * 不包邮 */ public boolean freeShipping() { return false; } }
钻石会员:DiamondMember.java
package strategy.member.impl; import strategy.member.MemberInterface; /** * 钻石会员 * @author vision */ public class DiamondMember implements MemberInterface{ /** * 会员价格,打九折 */ public Double getPrice(Double price) { return price*0.9; } /** * 包邮 */ public boolean freeShipping() { return true; } }
环境角色
PriceHandle.javapackage strategy; import strategy.member.MemberInterface; import strategy.member.impl.DiamondMember; import strategy.member.impl.GoldMember; import strategy.member.impl.NormalMember; /** * 价格处理类 * @author vision * @date 2016年10月12日 */ public class PriceHandle { private MemberInterface memberInterface; public void setMemberInterface(MemberInterface memberInterface) { this.memberInterface = memberInterface; } /** * 计算出需要支付的费用 * @return */ private Double getMemberPrice(Double price){ Double postage=5.0; if(memberInterface.freeShipping()){ postage=0.0; } return (memberInterface.getPrice(price)+postage); } }
客户端调用
public class TestClass{ public static void main(String[] args) { PriceHandle priceHandle=new PriceHandle(); //会员等级(0普通会员,1黄金会员,2钻石会员) int memberType=2; switch (memberType) { case 0: priceHandle.setMemberInterface(new NormalMember()); break; case 1: priceHandle.setMemberInterface(new GoldMember()); break; case 2: priceHandle.setMemberInterface(new DiamondMember()); break; } System.out.println(priceHandle.getMemberPrice(10.0));; } }
备注
参考资料:《Head First 设计模式》相关文章推荐
- 设计模式——策略模式:会员价格体系的简单实现
- 设计模式-简单工厂设计模式与策略模式之java实现
- 简单工厂设计模式实现商店买牙膏收费案例过渡到结合策略模式的理由全解
- HEAD_FIRST设计模式学习 ----策略模式 c++简单实现代码
- 设计模式之策略模式:简单实现
- 设计模式-简单工厂设计模式与策略模式之java实现二
- 设计模式学习笔记一 简单工厂策略模式实现销售策略的变更(一)
- 有趣的Java - 简单使用enum实现策略模式Strategy
- 用C++实现设计模式中的策略模式
- AspectJ实现设计模式(二)——策略模式
- 2010/7/30 初学设计模式、责任链实现filter、面向接口编程、策略模式修改排序算法
- 学习php设计模式 php实现策略模式(strategy)
- 设计模式C++实现(2)——策略模式
- 简单实现设计模式
- 设计模式C++实现(2)——策略模式
- 追MM与设计模式的JAVA实现-简单工厂方法
- 设计模式:策略模式的实现 c++ 与 java
- 设计模式心得笔记--简单工厂和策略模式
- 设计模式之使用Enum来实现strategy(策略模式系列2)
- AspectJ实现设计模式(二)——策略模式