您的位置:首页 > 其它

设计模式——策略模式:会员价格体系的简单实现

2017-02-16 10:55 477 查看

前言



上面这张图是京东商城的会员体系,总共包含五种不同等级的会员,分别是注册会员,铜牌会员,银牌会员,黄金会员,钻石会员。从上图可以看出,不同等级会员享有不同的优惠服务,那么这么多优惠服务在程序中是怎么实现的呢?最直接了当的方式,就是写一堆if else去做判断,这显然不是最佳实现方式,很不利于后期维护。实际上这里需要用到设计模式中的策略模式,针对不同等级的会员,每一种会员特权都拒用不同的优惠策略。

策略模式

定义算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

策略模式结构原型



策略模式的组成

应用场景(Context):

1、需要使用ConcreteStrategy提供的算法。

2、 内部维护一个Strategy的实例。

3、 负责动态设置运行时Strategy具体的实现算法。

4、负责跟Strategy之间的交互和数据传递。

抽象策略(StrategyInterface): 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。

具体策略(Strategy):包装了相关的算法和行为。

具体应用场景

具体策略划分

我们现在来模仿京东会员机制,将会员分为三种等级:普通会员,金牌会员,钻石会员。以下为会员优惠服务,不同等级的会员拥有不同的优惠策略:

优惠服务\会员等级普通会员黄金会员钻石会员
会员特价正常价打九折打九折
运费5元5元包邮

会员策略模型



代码实现

抽象策略角色

会员接口:MemberInterface.java

package strategy.member;
/**
* 会员接口
* @author vision
*/
public interface MemberInterface {
/**
* 会员价格
* @param price
* @return
*/
public Double getPrice(Double price);
/**
* 是否包邮
* @return
*/
public boolean freeShipping();
}

具体策略角色

普通会员:NormalMember.java

package 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.java

package 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 设计模式》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: