策略模式是一种行为型的设计模式,指的是一个类的行为或者算法可以在运行时更改,也就相当于将一个类的行为或者算法封装起来,使其可以独立于客户而变化。
策略模式类图:
例如加减乘除算法,我们只需要给计算器输入具体运算方法,计算器可以使用策略模式进行运算;再比如这么多的共享单车,如果有一个统一的容器,就可以不再单独下载App了,可以使用策略模式进行选择;再比如这么多的支付方式,我们只需要打开对应的支付方式,扫码一个容器二维码,就可以进行支付了。
下面我们使用支付方式进行代码的演示。
首先,我们有一个支付的接口:
public interface Pay{
public void pay(Double amount);
}
接着,我们建立4种支付的具体实现:
//支付宝支付的实现
public class AliPay implements Pay{
@Override
public void pay(Double amount){
System.out.println("支付宝支付" + amount + "元!");
}
}
//现金支付
public class CashPay implements Pay{
@Override
public void pay(Double amount){
System.out.println("现金支付" + amount + "元!");
}
}
//银联支付
public class UnionPay implements Pay{
@Override
public void pay(Double amount){
System.out.println("银联支付" + amount + "元!");
}
}
//微信支付
public class WeChatPay implements Pay{
@Override
public void pay(Double amount){
System.out.println("微信支付" + amount + "元!");
}
}
接着,我们建立一个支付的容器:
public class PayContext{
private Pay pay;
public Pay setPay(Pay pay){
this.pay = pay;
}
public void execute(Double amount){
pay.pay(amount);
}
}
最后,我们测试一下支付:
public class PayTest{
public static void main(String[] args){
PayContext payContext = new PayContext();
payContext.setPay(new AliPay());
payContext.execute(10.01);
payContext.setPay(new CashPay);
payContext.execute(9.90);
payContext.setPay(new UnionPay);
payContext.execute(11.12);
payContext.setPay(new WeChatPay);
payContext.execute(0.01);
}
}
策略模式在Spring中就有用到,Spring在实例化对象的时候,在SimpleInstantiationStrategy中有使用到。
策略模式的化,算法或者行为可以自由切换,可以避免使用多重条件判断,扩展性很好;但是,相对而言,其策略类会增多,并且所有的策略类都需要对外暴露接口。