设计模式 —— 策略模式

简介

策略模式(Strategy Pattern)属于对象的行为模式。其用意是针对一组算法,将每个算法封装到具备共同接口的独立的类中,从而使得它们能够相互替换。策略模式使得算法能够在不影响到客户端的状况下发生变化。java

策略模式是对算法的包装,是把使用算法的责任和算法自己分割开来,委派给不一样的对象管理。策略模式一般把一个系列的算法包装到一系列的策略类里面,做为一个抽象策略类的子类。用一句话来讲,就是:“准备一组算法,并将每个算法封装起来,使得它们能够互换”。算法

实例

策略模式及到三个角色:微信

  1. 抽象策略角色(Strategy):这是一个抽象角色,一般由一个接口或抽象类实现。此角色给出全部的具体策略类所需的接口;
  2. 具体策略角色(ConcreteStrategy):包装了相关的算法或行为;
  3. 上下文角色(Context):对策略进行二次封装,目的是避免高层模块对策略的直接调用。

在电商系统中,一般会集成多种支付方式。下面以一个支付调用例子演示下策略模式。框架

抽象角色:ide

public interface IPayStrategy {
    /** * 调用支付 */
    void doPay();
}
复制代码

具体策略模式:微信支付

// 支付宝支付
public class AliPayStrategy implements IPayStrategy {
    @Override
    public void doPay() {
        System.out.println("调用支付宝支付~");
    }
}

// 微信支付
public class WxPayStrategy implements IPayStrategy {
    @Override
    public void doPay() {
        System.out.println("调用微信支付~");
    }
}
复制代码

上下文角色:this

public class PayContext {

    private IPayStrategy payStrategy;

    public PayContext(IPayStrategy payStrategy) {
        this.payStrategy = payStrategy;
    }

    /** * 策略方法 */
    public void doPay() {
        payStrategy.doPay();
    }
}
复制代码

客户端:spa

public class Client {
    @Test
    public void testPay() {
        PayContext context;

        //调用支付宝支付
        context = new PayContext(new AliPayStrategy());
        context.doPay();

        // 调用微信支付
        context = new PayContext(new WxPayStrategy());
        context.doPay();
    }
}
复制代码

结果:设计

调用支付宝支付~
调用微信支付~
复制代码

类图

策略模式

优势

  1. 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承能够把公共的代码移到父类里面,从而避免代码重复;
  2. 使用策略模式能够避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采起哪种算法或采起哪种行为的逻辑与算法或行为的逻辑混合在一块儿,通通列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

缺点

  1. 客户端必须知道全部的策略类,并自行决定使用哪个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的状况;
  2. 因为策略模式把每一个具体的策略实现都单独封装成为类,若是备选的策略不少的话,那么对象的数目就会很可观。

适用场景

  1. 若是在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式能够动态地让一个对象在许多行为中选择一种行为;
  2. 一个系统须要动态地在几种算法中选择一种;
  3. 若是一个对象有不少的行为,若是不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

与 SPI 的区别

SPI 机制其实与 策略模式 相似。SPI 机制是 Java 中使用的一种技术实现,全称是 Service Provider Interface,即服务提供接口,通常用在开源框架研发领域。code

策略模式SPI 机制有下面几点异同:

  1. 从设计思想来看。策略模式和 SPI 机制其思想是相似的,都是经过必定的设计隔离变化的部分,从而让原有部分更加稳定;
  2. 从隔离级别来看。策略模式的隔离是类级别的隔离,而 SPI 机制是项目级别的隔离;
  3. 从应用领域来看。策略模式更多用在业务代码书写,SPI 机制更多用于框架的设计。

总结

策略模式 是对算法的封装,把一系列的算法分别封装到对应的类中,而且这些类实现相同的接口,相互之间能够替换。

策略模式 是一种简单经常使用的模式,咱们在进行开发的时候,会常常有意无心地使用它,通常来讲,策略模式 不会单独使用,跟 模版方法模式、工厂模式 等混合使用的状况比较多。

相关文章
相关标签/搜索