设计模式——策略模式:会员价格体系的简单实现
周sir |
2020年9月8日 |
Java技术, 设计模式 |
0 条评论 | 888
京东会员体系有注册、铜牌、银牌、黄金、钻石五档,不同等级享有不同优惠。程序里若用一堆 if-else 硬判,后期很难维护。更合适的是设计模式里的策略模式:针对不同等级会员,每一种特权对应一种优惠策略。
定义:定义算法簇,分别封装起来,让它们可以互相替换;此模式让算法的变化独立于使用算法的客户。参考:《Head First 设计模式》。
一、前言:会员体系
下面这张图是京东商城的会员体系:

二、策略模式结构
结构原型

组成
应用场景(Context):
-
需要使用 ConcreteStrategy 提供的算法。
-
-
负责动态设置运行时 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));;
}
}
一句话总结:策略模式把各档会员的计价和包邮规则封装成可替换算法,Context 运行时切换策略,避免一堆 if-else。
转载请注明来源:设计模式——策略模式:会员价格体系的简单实现
我是周sir,这是我的博客。致力于分享我学会的技术和优秀的文章。微信公众号 “周sir专栏” 欢迎大家关注。