其设计目标在于,我要选择一种方式(策略)来达到我的目的
public interface IPayStrategy {
boolean pay(int money);//支付
BigDecimal queryBalance();//查询余额
}
public class AliPayStrategy implements IPayStrategy {
@Override
public boolean pay(int money) {
System.out.println("支付宝支付成功");
return true;
}
@Override
public BigDecimal queryBalance() {
System.out.println("支付宝余额20元");
return new BigDecimal("20");
}
}
public class WechatPayStrategy implements IPayStrategy {
@Override
public boolean pay(int money) {
System.out.println("微信支付成功");
return true;
}
@Override
public BigDecimal queryBalance() {
System.out.println("微信余额10元");
return new BigDecimal(10);
}
}
public enum PayEnum {
AliPay("aliPay",new AliPayStrategy()),
WechatPay("wechatPay",new WechatPayStrategy());
private String key;
private IPayStrategy value;
PayEnum(String key, IPayStrategy value) {
this.key = key;
this.value = value;
}
public static IPayStrategy getValue(String key){
for (PayEnum payEnum : PayEnum.values()){//遍历枚举类
if (payEnum.key.equals(key)){
return payEnum.value;
}
}
return new AliPayStrategy();//没有合适key则默认支付宝支付
}
}
public class TestPayStrategy2 {
public static void main(String[] args) {
IPayStrategy IPayStrategy = PayEnum.getValue("aliPay");
IPayStrategy.pay(10);
IPayStrategy.queryBalance();
}
}
当一个模块需要选择的时候,并且选择任何一个对最终结果没有影响的时候,就需要策略模式,彼此策略之间可以独立又可以相互替换
优点
策略模式各个算法之间彼此独立,新增算法只需新增类就好了,符合开闭原则
可以简化代码中存在的大量 if 或者 switch 循环分支
缺点
当系统中存在很多策略的时候,会产生很多类,增加了系统的复杂性
使用者需要自行选择策略
ps:和工厂模式区别:
之前有不理解两个模式之间的区别,其实区别在于思想
1.用途不一样
工厂是创建型模式,它的作用就是创建对象;
策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;
2.关注点不一样
一个关注对象创建
一个关注行为的封装
3.解决不同的问题
工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。
策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。