1、概述
策略模式(strategy pattern)的原始定义是:定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。
2、优缺点
优点
算法可以自由切换。这是策略模式本身的定义,只要实现抽象策略就可以作为一个“策略”
避免使用多重条件判断。可以减少if-else的使用
拓展性良好。
缺点
策略类数量增多,且可复用性小
所有策略都要对外暴露。上层模块必须知道有哪些策略,然后才能决定使用,幸运的是可以使用其他模式来修正这个缺陷,如:工厂方法模式、代理模式、享元模式
3、实现方式
public class Test {
public static void main(String[] args) {
Context context;
// 刚到吴国时拆第一个
System.out.println("-----初到吴国启用第一个策略-----");
context = new Context(new BackDoor());
context.operate();
// 刘备乐不思蜀时
System.out.println("-----刘备乐不思蜀启用第二个策略-----");
context = new Context(new GivenGreenLight());
context.operate();
// 孙权追兵赶来
System.out.println("-----孙权追兵赶来启用第三个策略-----");
context = new Context(new BlockEnemy());
context.operate();
}
}
/**
* 策略接口
*/
public interface IStrategy {
// 每个策略必有一个执行的方法
public void operate();
}
/**
* 找乔国老开后门
*/
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
}
}
/**
* 吴国太开绿灯
*/
public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("求吴国太开绿灯,放行");
}
}
/**
* 孙夫人断后
*/
public class BlockEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵");
}
}
/**
* 锦囊
*/
public class Context {
private IStrategy strategy;
// 构造函数,需要使用哪个策略
public Context(IStrategy strategy){
this.strategy = strategy;
}
// 使用策略
public void operate(){
this.strategy.operate();
}
}
4、应用场景
支付方式选择:在电子商务平台中,用户可以选择不同的支付方式,如信用卡、PayPal、微信支付等。每种支付方式都是一个策略,可以根据用户的选择动态切换。
排序算法:在需要排序数据时,可能会有多种排序算法,如快速排序、归并排序、冒泡排序等。策略模式允许用户根据需要选择最合适的排序算法。
图形渲染:在图形处理软件中,不同的图形对象可能需要不同的渲染策略,例如,2D图形和3D图形的渲染方式不同。
数据访问:在多层架构中,数据访问层可能会使用不同的数据源或访问技术(如数据库、文件系统、远程服务等),策略模式可以用来封装这些不同的访问方式。
缓存策略:在需要缓存数据的系统中,可能会有多种缓存策略,如LRU(最近最少使用)、FIFO(先进先出)等,策略模式可以用来实现这些不同的缓存策略。
日志记录:在应用程序中,可能会有多种日志记录方式,如控制台日志、文件日志、数据库日志等。策略模式可以用来根据不同的需要选择不同的日志记录方式。
用户权限验证:在需要权限控制的系统中,可能会有多种权限验证策略,如基于角色的访问控制(RBAC)、基于属性的访问控制(ABAC)等。
算法动态切换:在需要根据不同条件动态切换算法的场景中,策略模式可以提供灵活的算法切换机制,例如,根据输入数据的特性选择不同的算法。
游戏AI行为:在游戏开发中,不同的角色可能会有不同的行为策略,如攻击、防御、逃跑等,策略模式可以用来实现这些不同的行为。
配置文件解析:在需要解析不同格式配置文件的系统中,如XML、JSON、YAML等,策略模式可以用来封装不同的解析算法。