定义
- 策略模式是行为型设计模式。
- 实现一组不同策略类,可以在各种场景中进行交替使用。所以策略模式注重的是策略类的组织和调用,对应策略具体的实现过程其实并不注重。
简单策略模式代码实现
- 首先创建一个策略顶级接口
/**
* 策略类统一规则接口
*
* @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等等源码里有大量运用。还有就是实际业务需求,如果商品活动策略,会员策略,数据源切换,第三方通道切换等等。
优劣势
-
优点
- 策略模式优势在于对应算法策略的解耦,每一个策略的实现都是单独的一个类,符合单一职责原则。
- 当有新的策略时就新增一个策略类,对原有的策略类并不影响,符合对修改关闭,对扩展开放原则。
- 隐藏了策略算法的实现,用户只需调用对应策略,而无需知晓具体实现细节。
- 可以使重复代码放到策略顶级接口,减少了重复代码。
-
缺点
- 增加了项目的复杂度和类的个数,会加大JVM类加载负荷,并且使项目体积更加庞大。
- 用户使用策略模式就需先知晓所有的策略实现,才能正确的选择具体的策略类。
-
虚心学习,共同进步 -_-