zoukankan      html  css  js  c++  java
  • Strategy 设计模式 策略模式 超靠谱原代码讲解

    先来假设一种情,我们需要向三种不同的客户做出不同的报价,一般来说要肿么设计呢,是不是马上会想到用IF,没有错,对于这种情况,策略模式是最好的选。大家可以这么理解,如果有情况需要用到大量的IF,那你用策略模式就一定没有错了。好了,不多说,直接上代码

    先建一个Customer,放三种不同的客户类型

    package Customer;
    
    import Inter.Strategy;
    
    public class LargeCustomer implements Strategy{
    	
    	public double calcPrice(double goodsPrice){
    		System.out.println("对于大客户,统一折扣10%");
    		return goodsPrice*(1-0.1);
    	}
    }
    

    package Customer;
    
    import Inter.Strategy;
    
    public class NormalCustomer implements Strategy{
    	/**
    	 * 
    	 * 具体算法的实现,为VIP1计算价格
    	 * 
    	 * */
    	public double calcPrice(double goodsPrice){
    		System.out.println("对于新客户或是普通客户,没有折扣");
    		return goodsPrice;
    		
    	}
    }
    

    package Customer;
    
    import Inter.Strategy;
    
    public class oldCustomer implements Strategy{
    	
    	public double calcPrice(double goodsPrice){
    		System.out.println("对于老客户,统一折扣5%");
    		return goodsPrice*(1-0.05);
    	}
    }
    

    再建一个接口Inter

    package Inter;
    
    public interface Strategy {
    /*
     * 
     * 
     * **/
    	public double calcPrice(double goodsPrice);
    }
    

    再来一个实现业务的报价系统

    package Price;
    
    import Inter.Strategy;
    
    public class Price {
    	private Strategy strategy = null;
    	
    	public Price (Strategy aStrategy){
    		this.strategy = aStrategy;
    	}
    	
    	public double quote(double goodsPrice){
    		return this.strategy.calcPrice(goodsPrice);
    	}
    }
    

    是不是很简单,接下来就可以调式了

    package Test;
    
    import Customer.LargeCustomer;
    import Inter.Strategy;
    import Price.Price;
    
    public class Clients {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    	   //实例化并使用LargeCustomer策略装载到策略器strategy当中
    		Strategy strategy = new LargeCustomer();
    		
    		//实例化报价者ctx,然后把已经装有策略的策略器strategy给它
    		Price ctx = new Price(strategy);
    		
    		//正式给报价者ctx输值2000,CTX会跟据已经装有策略的的策略器去执行策略,得出来的值塞给quote,其实不塞进接用该函数也可以显示值,大家懂的
    		double quote = ctx.quote(2000);
    		
    		System.out.println("向客户报价:" + quote);
    		
    		
    	}
    
    }
    


  • 相关阅读:
    BZOJ1000 A+B Problem
    网络最大流
    树形结构
    BZOJ2521 最小生成树 最小割
    HDU5266 LCA 树链剖分LCA 线段树
    BZOJ3991 寻宝游戏 LCA 虚树 SET
    深度优先搜索DFS
    斯特林数
    Noip2017 普及 T3 Chess
    键盘自动机
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314195.html
Copyright © 2011-2022 走看看