策略模式示例

策略模式示例

场景

会员打折系统根据会员类型总价进行打折 。

分析

会员类型静态数据:普通会员、中级会员、高级会员

总价动态数据

·

代码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));
		}
    }
   
}


posted @ 2022-05-30 23:09  赵钱富贵  阅读(95)  评论(0编辑  收藏  举报