设计模式之简单策略设计模式

178 阅读2分钟

定义

  • 策略模式是行为型设计模式。
  • 实现一组不同策略类,可以在各种场景中进行交替使用。所以策略模式注重的是策略类的组织和调用,对应策略具体的实现过程其实并不注重。

简单策略模式代码实现

  • 首先创建一个策略顶级接口
/**
 * 策略类统一规则接口
 *
 * @Author: ZRH
 * @Date: 2021/2/3 17:03
 */
public interface Book<T> {

    /**
     * 子策略类需要实现方法
     *
     * @param t
     */
    void doSome(T t);
}
  • 创建实现策略类
/**
 * 语文书策略类
 *
 * @Author: ZRH
 * @Date: 2021/2/3 17:04
 */
public class ChineseBook implements Book {

    @Override
    public void doSome(Object o) {
        System.err.println("看语文书,策略参数 = " + o);
    }
}
/**
 * 英语书策略类
 *
 * @Author: ZRH
 * @Date: 2021/2/3 17:03
 */
public class EnglishBook implements Book {

    @Override
    public void doSome(Object o) {
        System.err.println("看英语书,策略参数 = " + o);
    }
}
  • 需创建一个提供调用策略类的控制器类,解耦策略类和实际场景的调用。
/**
 * 策略类控制处理器
 *
 * @Author: ZRH
 * @Date: 2021/2/3 17:05
 */
public class BookContextHandler {

    private Book book;

    /**
     * 添加策略实现类对象
     *
     * @param book
     */
    public BookContextHandler(Book book) {
        this.book = book;
    }

    /**
     * 执行策略实现的方法
     *
     * @param object
     */
    public void doSome(String object) {
        this.book.doSome(object);
    }
}
  • 测试及运行结果
/**
     * 简单策略模式实践
     *
     * @param args
     */
    public static void main(String[] args) {

        // 创建策略类
        Book englishBook = new EnglishBook();
        Book chineseBook = new ChineseBook();

        // 策略类处理器执行策略
        new BookContextHandler(englishBook).doSome("english");
        new BookContextHandler(chineseBook).doSome("chinese");
    }
看英语书,策略参数 = english
看语文书,策略参数 = chinese

实际场景

  • 策略模式在实际项目中是使用比较多的一种设计模式,比如在JDK,spring等等源码里有大量运用。还有就是实际业务需求,如果商品活动策略,会员策略,数据源切换,第三方通道切换等等。

优劣势

  • 优点

    1. 策略模式优势在于对应算法策略的解耦,每一个策略的实现都是单独的一个类,符合单一职责原则。
    2. 当有新的策略时就新增一个策略类,对原有的策略类并不影响,符合对修改关闭,对扩展开放原则。
    3. 隐藏了策略算法的实现,用户只需调用对应策略,而无需知晓具体实现细节。
    4. 可以使重复代码放到策略顶级接口,减少了重复代码。
  • 缺点

    1. 增加了项目的复杂度和类的个数,会加大JVM类加载负荷,并且使项目体积更加庞大。
    2. 用户使用策略模式就需先知晓所有的策略实现,才能正确的选择具体的策略类。
  • 虚心学习,共同进步 -_-