设计模式-策略+工厂模式使用模版


一、前言

在日常开发中,我们经常会面临很多 if-else 的代码,为了提升代码的可维护性、让代码更优雅,我们可以尝试使用策略 + 工厂设计模式。下面是一个使用模版,我们在开发的时候直接套用就行了。

二、模版

2.1、定义策略接口

定义一个策略接口,这个接口将由不同的策略实现:

public interface XxxStrategy {
    /**
     * 执行的方法
     */
    void execute();

    /**
     * 获取类型。比如 1 -> 策略A,2 -> 策略B
     */
    int getType();
}

2.2、创建几个策略实现接口

@Component
public class AStrategy implements XxxStrategy {
    @Override
    public void execute() {
        System.out.println("Executing AStrategy");
    }

    @Override
    public int getType() {
        return 1;
    }
}

@Component
public class BStrategy implements XxxStrategy {
    @Override
    public void execute() {
        System.out.println("Executing BStrategy");
    }

    @Override
    public int getType() {
        return 2;
    }
}

// ... 更多策略类 ...

2.3、创建工厂

@Component
public class XxxStrategyFactory {
    private final Map<Integer, XxxStrategy> strategies;

    @Autowired
    public XxxStrategyFactory(List<XxxStrategy> strategyList) {
        this.strategies = new HashMap<>();
        strategyList.forEach(strategy -> strategies.put(strategy.getType(), strategy));
    }

    public XxxStrategy getStrategy(int type) {
        return strategies.get(type);
    }
}

XxxStrategyFactory 这个工厂类中,我们利用构造器注入机制汇集了所有 XxxStrategy 接口的实现类。这些实现类根据自身定义的 type 属性被组织在一个映射表中,使得我们可以通过特定的 type 快速访问相应的策略对象。

加上 @Autowired 注解的构造方法使得Spring能够自动完成依赖注入,将所有 XxxStrategy 的实现类实例化为一个列表并传递给构造器。这一列表随后被遍历,以创建 type 到策略实例的映射。

从 Spring 4.3 版本起,单构造函数的类不必显式使用 @Autowired 注解,因为 Spring 默认会对这个唯一的构造函数应用自动依赖注入。

2.4、使用 demo

@RestController
@RequestMapping("/api")
public class XxxController {

    @Autowired
    private XxxStrategyFactory strategyFactory;

    @GetMapping("/xxx/{type}")
    public ResponseEntity<?> xxx(@PathVariable int type) {
        XxxStrategy strategy = strategyFactory.getStrategy(type);
        if (strategy != null) {
            strategy.execute();
            return ResponseEntity.ok().build();
        }
        
        return ResponseEntity.badRequest().body("Invalid type provided");
    }
}

在这个XxxController中,我们定义了一个xxx方法,这个方法通过路径变量接收type,然后使用策略工厂来获取对应的策略实现,并执行它。

三、最后

我是 xiucai,一位后端开发工程师。

如果你对我感兴趣,请移步我的个人博客,进一步了解。

- 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注😊

- 本文首发于个人博客,未经许可禁止转载💌


文章作者: xiucai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xiucai !
  目录