• 策略模式(Strategy)


    @@@模式定义:
    定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
    本模式使得算法可独立于使用它的客户而变化。

    @@@练习示例: 
    报价管理

    @@@示例代码:
    patternStrategy.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package pattern;
    
    /**
     * 策略,定义计算报价算法的接口
     */
    public interface Strategy {
        /**
         * 计算应报的价格
         * @param goodsPrice 商品销售原价
         * @return 计算出来的,应该给客户报的价格
         */
    	public double calcPrice(double goodsPrice);
    }


    patternPrice.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package pattern;
    
    /**
     * 价格管理,主要完成计算向客户所报价格的功能
     */
    public class Price {
        /**
         * 持有一个具体的策略对象
         */
    	private Strategy strategy = null;
    	
    	/**
    	 * 构造方法,传入一个具体的策略对象
    	 * @param aStrategy 具体的策略对象
    	 */
    	public Price(Strategy aStrategy) {
    		this.strategy = aStrategy;
    	}
    	
    	/**
    	 * 报价,计算对客户的报价
    	 * @param goodsPrice 商品销售原价
    	 * @return 计算出来的,应该给客户报的价格
    	 */
    	public double quote(double goodsPrice) {
    		return this.strategy.calcPrice(goodsPrice);
    	}
    }


    patternNormalCustomerStrategy.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package pattern;
    
    /**
     * 具体算法实现,为新客户或者是普通客户计算应报的价格
     */
    public class NormalCustomerStrategy implements Strategy {
    	@Override
    	public double calcPrice(double goodsPrice) {
    		System.out.println("对于新客户或者是普通客户,没有折扣");
    		return goodsPrice;
    	}
    }


    patternOldCustomerStrategy.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package pattern;
    
    /**
     * 具体算法实现,为老客户计算应报的价格
     */
    public class OldCustomerStrategy implements Strategy {
    	@Override
    	public double calcPrice(double goodsPrice) {
    		System.out.println("对于老客户,统一折扣5%");
    		return goodsPrice * (1 - 0.05);
    	}
    }


    patternLargeCustomerStrategy.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package pattern;
    
    /**
     * 具体算法实现,为大客户计算应报的价格
     */
    public class LargeCustomerStrategy implements Strategy {
    	@Override
    	public double calcPrice(double goodsPrice) {
    		System.out.println("对于大客户,统一折扣10%");
    		return goodsPrice * (1 - 0.1);
    	}
    }


    userClient.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    package user;
    
    import pattern.LargeCustomerStrategy;
    import pattern.Price;
    import pattern.Strategy;
    
    public class Client {
        public static void main(String[] args) {
        	// 1: 选择并创建需要使用的策略对象
        	Strategy strategy = new LargeCustomerStrategy();
        	// 2: 创建上下文
        	Price ctx = new Price(strategy);
        	
        	// 3: 计算报价
        	double quote = ctx.quote(1000);
        	System.out.println("向客户报价: " + quote);
        }
    }    
    


    @@@模式的实现:
    策略算法是相同行为的不同实现。

    @@@模式的优点:
    1) 定义一系列算法;
    2) 避免多重条件语句;
    3) 更好的扩展性;

    @@@模式的缺点:
    1) 客户必须了解每种策略的不同;
    2) 增加了对象数目;
    3) 只适合扁平的算法结构;

    @@@模式的本质:
    分离算法,选择实现

    @@@模式体现的设计原则:
    1) 开闭原则;
    2) 里氏替换原则;


  • 相关阅读:
    服务列表
    Tinyfool的2013年总结————在困惑和挣扎中试图前行
    支付平台程序,支付程序,网络pos程序,api接口程序,锋锐支付平台程序开发领导者!
    是新浪移动云
    Convert SVG to PNG in Python
    qrcode 4.0.4 : Python Package Index
    CairoSVG
    cairo graphics.org
    The Apache™ Batik Project
    Online SVG to PNG/JPEG/TIFF conversion
  • 原文地址:https://www.cnblogs.com/james1207/p/3285511.html
Copyright © 2020-2023  润新知