策略模式示例
策略模式示例
场景
会员打折系统根据会员类型或总价进行打折 。
分析
会员类型是静态数据:普通会员、中级会员、高级会员
总价是动态数据
·
代码1
普通的方法使用if else 判断 。
/**
* type 会员类型
* price 商品总价
*
*/
if(type == "中级会员"){
打九折
}else if(type == "高级会员"){
打八折
}else{
不打折
}
if(price>1000){
打8折
}else{
不打折
}
代码2
改进1,使用策略模式,实现策略接口
/**
*接口 MemberStrategy
*/
public interface MemberStrategy {
// 一个计算价格的抽象方法
public double calcPrice(double price);
}
/**
*实现策略1
* 普通会员——不打折
*/
public class MemberPrimaryStrategy implements MemberStrategy {
// 重写策略方法具体实现功能
@Override
public double calcPrice(double price) {
return price ;
}
}
/**
*实现策略2
* 中级会员——打9折
*/
public class MemberIntermediateStrategy implements MemberStrategy {
@Override
public double calcPrice(double price) {
double money = price * 0.9;
return money;
}
}
/**
*实现策略3
* 高级会员——打8折
*/
public class MemberAdvanceStrategy implements MemberStrategy {
@Override
public double calcPrice(double price) {
double money = price * 0.8;
return money;
}
}
/**
应用层 ,把具体的策略 提取到不同的实现类中,修改实现类即可
但仍需维护 if else
*/
public class Application {
void go(){
MemberAdvanceStrategy strategy=null ;
if(type == "advance"){
strategy = new MemberAdvanceStraty
}
}
}
代码3
改进 2 ,使用简单工厂模式
让应用侧尽可能少做改动,
(1)加入简单工厂模式
(2)抽象类中提供方法,根据type 和price 静态和动态返回策略
/**
1.0 MemberStrategy
*/
public interface MemberStrategy {
// 一个计算价格的抽象方法
public double calcPrice(double price);
//获取 策略类型 (固定)
public String getType();
//根据总价判断 是否支持该策略 (动态)
public boolean support(double totalPrice);
}
/**
1.1三个策略实现类
普通会员——不打折
*/
public class MemberPrimaryStrategy implements MemberStrategy { // 实现策略
// 重写策略方法具体实现功能
@Override
public double calcPrice(double price) {
return price ;
}
@Override
public String getType() {
return "primary";
}
@Override
public boolean support(double totalPrice) {
return totalPrice < 300;
}
}
/**
1.2中级会员 打百分之10的折扣
*/
public class MemberIntermediateStrategy implements MemberStrategy {
@Override
public double calcPrice(double price) {
double money = price * 0.9;
return money;
}
@Override
public String getType() {
return "intermediate";
}
@Override
public boolean support(double totalPrice) {
return totalPrice < 1000 && totalPrice >= 300;
}
}
/**
1.3 高级会员类 20%折扣
*/
public class MemberAdvanceStrategy implements MemberStrategy {
@Override
public double calcPrice(double price) {
double money = price * 0.8;
return money;
}
@Override
public String getType() {
return "advance";
}
@Override
public boolean support(double totalPrice) {
return totalPrice >= 1000;
}
}
/**
根据 会员类型/总价 选择相应的策略、
,之后增加修改策略,添加相应的策略实现类,修改工厂即可
*/
public class MemberStrategyFactory {
static List<MemberStrategy> memberStrategies=Arrays.asList(new MemberStrategy[] {
new MemberPrimaryStrategy(),new MemberIntermediateStrategy(),new MemberAdvanceStrategy()
} );
/**
* 根据 会员类型获取策略
* @param type
* @return
*/
public static MemberStrategy getStrategy(String type) {
if(type==null) {
return null;
}
for(MemberStrategy strategy:memberStrategies) {
if(type.equals(strategy.getType())) {
return strategy;
}
}
return null;
}
/**
* 根据总价选择
* @param totalPrice
* @return
*/
public static MemberStrategy getStrategy(double totalPrice) {
for(MemberStrategy memberStrategy:memberStrategies) {
if(memberStrategy.support(totalPrice)) {
return memberStrategy;
}
}
return null;
}
}
/*
应用层
*/
public class Application {
void go(){
String type="primary";
double price=1000;
MemberStrategy strategy = MemberStrategyFactory.getStrategy(price);
if(strategy!=null) {
System.out.println(strategy.calcPrice(price));
}
}
}