• 策略模式示例


    策略模式示例

    场景

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

    分析

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

    总价动态数据

    ·

    代码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));
    		}
        }
       
    }
    
    
    
  • 相关阅读:
    Laravel5.1 响应--Response
    Laravel5.1 请求--Request
    Laravel5.1 控制器--Controller
    Laravel5.1 模型--查询作用域
    Laravel5.1 模型--删除
    VMware Workstation错误Transport(VMDB)error -44:Message
    如何给flash里面添加链接
    巧用:empty解决webkit核心浏览器text-indent的bug
    form radio & checkbox解决方案
    字符串的第几个
  • 原文地址:https://www.cnblogs.com/mznsndy/p/16328746.html
Copyright © 2020-2023  润新知