码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-02-16 12:58:46      阅读:1194      评论:0      收藏:0      [点我收藏+]

标签:case   mem   context   京东   auth   tag   public   pac   ext   

前言

技术分享

上面这张图是京东商城的会员体系,总共包含五种不同等级的会员,分别是注册会员,铜牌会员,银牌会员,黄金会员,钻石会员。从上图可以看出,不同等级会员享有不同的优惠服务,那么这么多优惠服务在程序中是怎么实现的呢?最直接了当的方式,就是写一堆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 设计模式》

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

标签:case   mem   context   京东   auth   tag   public   pac   ext   

原文地址:http://www.cnblogs.com/visionit/p/6404678.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!