简介
定义了一系列的算法,把他们封装起来,他们相互之间可以替换,某个算法的调整或者新增不会影响其他的算法,是在执行期间来选择具体的算法,使用什么算法被推迟到运行时,使得系统更加灵活,复用性更高,该模式可以减少if else的数量,属于行为型。
适用场景
1、系统有很多类,但是他们的区别只是行为不同
2、一个系统需要动态的在几个算法中选择一种
优点
1、可以减少ifelse语句
2、提高算法的保密性和安全性
3、符合开闭原则
缺点
1、客户端需要知道所有策略类,自己决定使用哪个策略类
2、类的数量增加
代码示例
订单策略接口
public interface OrderStrategy {
OrderTypeEnum supportType();
void saveOrder();
}
支付宝下单策略
public class AlipayStrategy implements OrderStrategy {
public OrderTypeEnum supportType() {
return OrderTypeEnum.ALIPAY;
}
public void saveOrder() {
System.out.println("支付宝支付完成");
}
}
微信下单策略
public class WxpayStrategy implements OrderStrategy{
public OrderTypeEnum supportType() {
return OrderTypeEnum.WXPAY;
}
public void saveOrder() {
System.out.println("微信支付完成");
}
}
空策略类
public class EmptyStrategy implements OrderStrategy {
public OrderTypeEnum supportType() {
return null;
}
public void saveOrder() {
System.out.println("没有支付方式");
}
}
订单类型枚举类
public enum OrderTypeEnum {
/**
* 支付宝、微信
*/
ALIPAY,WXPAY
}
下单工厂类
public class OrderFactory {
private OrderFactory(){
}
/** spring下通过spring来获取所有的bean */
private static OrderStrategy[] strategies = new OrderStrategy[]{new AlipayStrategy(),new WxpayStrategy()};
private static OrderStrategy EMPTY_STRATEGY = new EmptyStrategy();
private static OrderStrategy getOrderStrategy(String orderType) {
for (OrderStrategy handler : strategies) {
if (handler.supportType().name().equals(orderType)) {
return handler;
}
}
return EMPTY_STRATEGY;
}
public static void saveOrder(String orderType){
getOrderStrategy(orderType).saveOrder();
}
}
测试类
public class StrategyTest {
public static void main(String[] args) {
OrderFactory.saveOrder("ALIPAY");
OrderFactory.saveOrder("WXPAY");
OrderFactory.saveOrder("ICBC");
}
}
输出结果为:
支付宝支付完成
微信支付完成
没有支付方式
源码分析
spring中应用
Resource
如图,有不同的策略类,
InstantiationStrategy
从名字上就可以看出是策略模式,
也可以通过set方法来进行配置。
public void setInstantiationStrategy(InstantiationStrategy instantiationStrategy) {
this.instantiationStrategy = instantiationStrategy;
}
本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载