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

    |     2020年9月8日   |   Java技术, 设计模式   |     0 条评论   |    888

京东会员体系有注册、铜牌、银牌、黄金、钻石五档,不同等级享有不同优惠。程序里若用一堆 if-else 硬判,后期很难维护。更合适的是设计模式里的策略模式:针对不同等级会员,每一种特权对应一种优惠策略。

定义:定义算法簇,分别封装起来,让它们可以互相替换;此模式让算法的变化独立于使用算法的客户。参考:《Head First 设计模式》。

一、前言:会员体系

下面这张图是京东商城的会员体系:

172010_Fcrk_2249566

二、策略模式结构

结构原型

095925_c5AT_2249566

组成

应用场景(Context):

  • 需要使用 ConcreteStrategy 提供的算法。
  • 内部维护一个 Strategy 的实例。
  • 负责动态设置运行时 Strategy 具体的实现算法。
  • 负责跟 Strategy 之间的交互和数据传递。

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

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

三、会员价格场景

模仿京东,将会员分成普通、金牌、钻石三档。不同等级优惠策略如下:

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

会员策略模型:

105153_Vrv1_2249566

四、代码实现

抽象策略角色

会员接口: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));;
	}
}

一句话总结:策略模式把各档会员的计价和包邮规则封装成可替换算法,Context 运行时切换策略,避免一堆 if-else。

转载请注明来源:设计模式——策略模式:会员价格体系的简单实现
本文链接地址:https://ai.zhousir.top/?p=3038
回复 取消