1.定义
定义一系列的算法类,将每一个算法封装起来,并可以相互替换。
策略模式让算法在客户端调用他们的时候能够互相不影响的变化。
2.案例
我们开发的系统中需要集成微信、支付宝、京东等各个支付渠道
2.1 UML
2.2 代码
/**
* @ClassName Launcher
* @Description: 策略模式启动类
* @Author cw
* @Date 2020/2/28
**/
public class Launcher{
public static void main(String[] args) {
Context context = new Context();//定义环境类
context.setHandlerPay(new WechatHandlerPay());//实例化微信支付的策略类
context.process();//执行环境类中业务调用
}
}
/**
* 抽象策略类(支付)
*/
interface HandlerPay {
void invoke();
}
/**
* 具体的策略类(微信支付)
*/
class WechatHandlerPay implements HandlerPay {
public void invoke(){
//TODO 调用微信支付接口
System.out.println("调用微信支付接口");
}
}
/**
* 具体的策略类(支付宝支付)
*/
class AliHandlerPay implements HandlerPay {
public void invoke(){
//TODO 调用阿里支付接口
System.out.println("调用阿里支付接口");
}
}
/**
* 环境类(支付宝支付)
*/
class Context{
private HandlerPay handlerPay;
public void setHandlerPay(HandlerPay handlerPay) {
this.handlerPay = handlerPay;
}
public void process(){
System.out.println("调用支付接口前");
handlerPay.invoke();
System.out.println("调用支付接口后");
}
}
3.策略模式的意义
- 策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。
- 弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。
4.在策略模式结构图中包含如下几个角色:
- Context(环境类):环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。
- Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。
- ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。
5.不足
- 客户端必须要知道所有的策略类,并自行决定要调用哪个策略类。
- 造成很多的策略类。