设计模式--策略模式+工厂模式+依赖注入

89 阅读2分钟

1 知识点概述

  1. spring控制反转+父类@PostStruct实现工厂的自动注册:实现策略的可扩展性
  2. 父类泛型约束+<? extend 父类> :代码规范和策略处理对象的可扩展性
  3. 接口枚举字符串类: 策略key的可扩展性

2.基本项目结构和概述

2.0 bean的生命周期

生命周期阶段

  1. 依赖注入(Dependency Injection) : 在@PostConstruct注解的方法执行之前,所有标记为@Autowired或通过XML配置的依赖项都应该已经被注入到Bean中。
  2. 执行@PostConstruct方法: 在依赖注入完成后,容器会调用标记了@PostConstruct注解的方法。这个方法可以执行任何初始化逻辑。
  3. Bean的完整生命周期: 执行完@PostConstruct方法后,Bean就进入了其完整的生命周期,可以被应用程序的其他部分使用。

2.1 基本使用

目录

image.png

继承关系图

image.png 应用时,直接使用Utils中的方法,封装基本的输入输出

public static  AbractStrategy demo(String strategy){

    AbractStrategy<baseDTO> strategy1 = StrategyFactory.getStrategy(strategy);
    System.out.println(strategy1);
    return  strategy1;
}

2.2 策略模式和工厂模式的代码实现

策略类 +泛型

public  abstract class AbractStrategy<K extends  baseDTO> {
    @PostConstruct
    protected void registerMyselfToFactory() {
        StrategyFactory.register(getname(),this);
    }

/*
* 一些通用方法
* */
    protected abstract String getname();

}

@PostConstruct会在初始化类的时候加载这条方法,当继承时,子类等于也由这段代码 添加

@componet等注解时,会加载这条方法(如果不添加注解,会为空)

具体的策略实现类

@Service
public class demoStrategy2 extends AbractStrategy<App2baseDTO>{

    @Override
    protected String getname() {
        return "name2";
    }
}

工厂类

1.使用ConcurrentHashMap存储数据

2.(AbractStrategy )strategyMap.get(strategyName)泛型的强转

public class StrategyFactory {
    static Map<String , AbractStrategy<?>> strategyMap =  new ConcurrentHashMap<>(8);

    public static <K extends  baseDTO> void register(String strategyName, AbractStrategy<K> strategyService){
        strategyMap.put(strategyName, strategyService);
    }
    @SuppressWarnings("unchecked")
    public static <K extends  baseDTO> AbractStrategy<K> getStrategy(String strategyName){
        return (AbractStrategy<K> )strategyMap.get(strategyName);
    }
}

3.测试

在普通main方法中无法调用
   public static void main(String[] args) {
        AbractStrategy<baseDTO> strategy = StrategyFactory.getStrategy("name2");
        System.out.println(strategy);

    }
在springboottest中  可以调用
void contextLoads() {
    AbractStrategy demoStrategy1 = baseDTOUtils.demo("name2");
    System.out.println(demoStrategy1);

}