定义:策略模式的基本含义是针对一组算法或行为特性,将他们抽象到具有共同接口函数的独立抽象类或接口中,从而使得他们可以相互替换。这样就使得某一个特定的接口行为可以在不影响客户端的情况下发生变化。
策略模式不能严格称之为一种设计模式,因为它仅仅是一个接口的多个实现在运行期的选择性特换而已。
策略模式所涉及的主要角色:
环境角色:持有一个Strategy类的引用,将决定调用哪种Strategy角色完成业务逻辑
抽象策略角色:这是一个抽象的策略角色,由一个借口或抽象类来扮演这个角色。这个角色是策略模式的核心,他是所有策略算法的核心归纳,因而对外表现为一个一直的接口函数
具体策略角色:封装了具体的策略算法或行为。
策略模式的核心是算法的包装,其最终目的是把使用算法的责任(环境)和算法的实现进行解耦、由于环境和算法的独立,算法的增加,减少或者修改都不会影响到环境和客户端的调用,当出现新的算法或者现有算法的实现发生变化时,我们只需要改变具体的策略类,并在客户端调用的地方进行注册即可。在这种情况下,策略模式中的算法实现都是可插拔的。
应用场景:对于某只能够业务可能存在多种不同的算法实现,eg:电子商务中计算总价有折扣和无折扣的场景。
策略模式可以带来的好处;
策略模式提供了管理一组算法组的方法:通过接口和多个算法实现之间的契约接口来完成业务场景
策略模式提供了可以替换通过集成进行对象行为扩展的方法:使用公共抽象接口的不同实现类而非一个抽象类的继承链完成行为的扩展
策略模式提供了将短发的调用责任与算法逻辑进行解耦的方法:通过角色转移,将调用环境角色与算法抽象之间分开形成引用关系。
package com.slp.Strategy; public interface PriceCalculationStrategy { public double calculatePrice(); }
package com.slp.Strategy; public class NoDiscountPriceCalculationStrategy implements PriceCalculationStrategy { private double price; private double copies; public NoDiscountPriceCalculationStrategy(double price, double copies) { this.price = price; this.copies = copies; } public double calculatePrice() { return price * copies; } }
package com.slp.Strategy; public class PercentageDiscountPriceCalculationStrategy implements PriceCalculationStrategy { private double price; private double copies; private double rate; public PercentageDiscountPriceCalculationStrategy(double price, double copies, double rate) { super(); this.price = price; this.copies = copies; this.rate = rate; } public double calculatePrice() { // TODO Auto-generated method stub return price * copies * rate; } }