• 实用设计模式实战:工厂+策略


    这个模式主要可以用来替代项目中的if/else

      public static void main(String[] args){
        String type = "common";
        operateByType(type);
      }
    
      private static void operateByType(String type) {
        if ("common".equals(type)){
          System.out.println("先查询缓存,缓存没有在查询数据库,同时更新缓存");
        }
        if ("update".equals(type)){
          System.out.println("直接更新缓存");
        }
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    以上初级代码使用设计模式改造

    public interface AttributeNumberService {
      String getType();
    
      void operateByType();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    @Slf4j
    @Service
    public class CommonAttributeNumberServiceImpl implements AttributeNumberService {
    
      @Override
      public String getType() {
        return "common";
      }
    
      @Override
      public void operateByType() {
         System.out.println("先查询缓存,缓存没有在查询数据库,同时更新缓存");
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    @Slf4j
    @Service
    public class UpdateAttributeNumberServiceImpl implements AttributeNumberService {
    
      @Override
      public String getType() {
        return "update";
      }
    
      @Override
      public void operateByType() {
        System.out.println("直接更新缓存");
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在setApplicationContext 方法中获取实现了AttributeNumberService接口的所有类。添加到一个map(工厂)中

    
    @Service
    public class AttributeNumberStrategy implements ApplicationContextAware {
    
      private Map<String, AttributeNumberService> processServiceMap;
    
      public AttributeNumberService getProcessService(String type) {
        return processServiceMap.get(type);
      }
    
      @Override
      public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        //获取AttributeNumberService接口的所有实现
          Map<String, AttributeNumberService> beansOfType =
            applicationContext.getBeansOfType(AttributeNumberService.class);
        processServiceMap = Maps.newHashMap();
        //put进容器  
        beansOfType.values().forEach(v -> processServiceMap.putIfAbsent(v.getType(), v));
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    AttributeNumberStrategy类可以看成是一个工厂类,实现了ApplicationContextAware接口

    ApplicationContextAware 接口是 Spring Framework 提供的一个接口,用于在 Spring 容器初始化时将应用程序上下文(ApplicationContext)实例传递给实现了该接口的类。通过实现这个接口,你可以在你的 Spring Bean 中获取到应用程序上下文,从而访问容器中的其他 Bean 或执行其他与容器相关的操作。
    当一个类实现了 ApplicationContextAware 接口后,Spring 容器会在初始化这个 Bean 的时候调用其 setApplicationContext 方法,将当前的应用程序上下文作为参数传递进去。

    使用时根据传的type不同,返回不同的实现类。调用相同的方法执行不同的逻辑。

      @Test
      public void operateByTypeTest(){
        AttributeNumberService processService = attributeNumberStrategy.getProcessService("update");
        processService.operateByType();
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意,类型可以放在枚举中哦

    @Getter
    @AllArgsConstructor
    public enum AffinityCacheEnum {
    
      COMMON("common", "普通"),
    
      UPDATE("update", "更新"),
      ;
    
      private final String type;
    
      private final String desc;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    pNA修饰肽:H-D-Leu-Thr-Arg-pNA,H-D-Leu-Thr-Arg-pNA,CAS号: 122630-72-2/3326-63-4
    K8S Pod控制器:ReplicationController ReplicaSet Deployment三者的联系与区别
    在Docker容器中修改PostgresSQL最大连接数
    JAVA访问SFTP
    【KVM-6】KVM/QEMU软件栈
    神经网络和AI的关系
    C++11各种锁的具体使用
    Nginx之sticky第三方模块使用解读
    Mongodb操作基础 分片
    期货十三篇 第六篇 加仓篇
  • 原文地址:https://blog.csdn.net/qq_25292419/article/details/133365797