策略模式实践

目录

前言

五个部分

名词解释

代码

controller层

HelloService接口

实现类

自定义注解

上下文

策略工厂

[Java SPI配置](#Java SPI配置)

验证


前言

五个部分

接口、实现类、自定义注解、上下文、策略工厂

名词解释

自定义注解(方便后期增加实现类后灵活控制策略)

上下文(初始化接口,进行数据承接)

策略工厂(利用java SPI使接口与实现解耦,并通过验证注解是否存在,调用不同的策略)

代码

controller层

java 复制代码
package com.zsp.sheji.JavaSPI;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("hello")
public class HelloController {

    @PostMapping("/pay")
    public String pay(){
        PayContext payContext = new PayContext();
        payContext.setHelloService(PayFactory.makeHello("helloOne"));
        String result = payContext.sayHello("你好");
        return result;
    }
}

HelloService接口

java 复制代码
package com.zsp.sheji.JavaSPI;

public interface HelloService {
    String sayHello(String hello);
}

实现类

这里写了两个实现类,模拟真实环境中的不同策略调用

HelloOneServiceImpl

java 复制代码
package com.zsp.sheji.JavaSPI;

import org.springframework.stereotype.Service;

@Pay(type = "helloOne")
@Service
public class HelloOneServiceImpl implements HelloService{
    @Override
    public String sayHello(String hello) {
       return  hello + "=== one";
    }
}

HelloTwoServiceImpl

java 复制代码
package com.zsp.sheji.JavaSPI;

import org.springframework.stereotype.Service;

@Pay(type = "helloTwo")
@Service
public class HelloTwoServiceImpl implements HelloService{
    @Override
    public String sayHello(String hello) {
        return hello + "=== two";
    }
}

自定义注解

java 复制代码
package com.zsp.sheji.JavaSPI;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Pay {
    String type();
}

上下文

java 复制代码
package com.zsp.sheji.JavaSPI;

import org.springframework.stereotype.Component;

@Component
public class PayContext {

    private HelloService helloService;

    public void setHelloService(HelloService helloService){
        this.helloService = helloService;
    }

    public PayContext(){}

    public String sayHello(String hello){
        // 上下文进行数据承接
        return this.helloService.sayHello(hello);
    }
}

策略工厂

java 复制代码
package com.zsp.sheji.JavaSPI;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.ServiceLoader;

public class PayFactory {
    private static Map<String,HelloService> helloMap = new HashMap<>();

    static {
        ServiceLoader<HelloService> load = ServiceLoader.load(HelloService.class);
        Iterator<HelloService> iterator = load.iterator();
        while (iterator.hasNext()) {
            HelloService next = iterator.next();
            Class<? extends HelloService> aClass = next.getClass();
            if (!aClass.isAnnotationPresent(com.zsp.sheji.JavaSPI.Pay.class)) {
                // 不存在添加进去
                throw new IllegalStateException("class: " + aClass + " expect @com.zsp.sheji.策略模式高级注解方式.PayType, but not found!");
            }
            helloMap.put(aClass.getAnnotation(Pay.class).type(), next);
        }
    }

    public static HelloService makeHello(String type){
        return helloMap.get(type);
    }
}

Java SPI配置

文件名:com.zsp.sheji.JavaSPI.HelloService 对应接口的全限定类名

java 复制代码
com.zsp.sheji.JavaSPI.HelloOneServiceImpl
com.zsp.sheji.JavaSPI.HelloTwoServiceImpl

项目结构

验证

相关推荐
穷儒公羊3 天前
第二章 设计模式故事会之策略模式:魔王城里的勇者传说
python·程序人生·设计模式·面试·跳槽·策略模式·设计规范
汤姆大聪明4 天前
【软件设计模式】策略模式
设计模式·策略模式
xiaogg36785 天前
SpringBoot applicationContext.getBeansOfType获取某一接口所有实现类,应用于策略模式
java·spring boot·策略模式
Best_Liu~5 天前
策略模式 vs 适配器模式
java·spring boot·适配器模式·策略模式
Ronin-Lotus5 天前
上位机知识篇---命名规则
策略模式
南猿北者8 天前
Cmake学习笔记
笔记·学习·策略模式
哆啦code梦8 天前
趣谈设计模式之策略模式-比特咖啡给你一杯满满的情绪价值,让您在数字世界里”畅饮“
设计模式·策略模式
克拉克盖博11 天前
chapter03_Bean的实例化与策略模式
java·spring·策略模式
我命由我1234512 天前
软件开发 - 避免过多的 if-else 语句(使用策略模式、使用映射表、使用枚举、使用函数式编程)
java·开发语言·javascript·设计模式·java-ee·策略模式·js
饕餮争锋13 天前
设计模式笔记_行为型_策略模式
笔记·设计模式·策略模式