策略模式实践

目录

前言

五个部分

名词解释

代码

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

项目结构

验证

相关推荐
一个在高校打杂的20 小时前
honeypot之opencanary(轻量化蜜罐)
linux·网络安全·网络攻击模型·安全威胁分析·策略模式
蜡笔小马2 天前
13.C++设计模式-策略模式
c++·设计模式·策略模式
杜子不疼.3 天前
【C++ AI 大模型接入 SDK】 - LLMProvider 抽象基类与策略模式
开发语言·c++·策略模式
代码对我眨眼睛4 天前
Mac 如何单独修改鼠标滚动方向,而不影响触控板
macos·计算机外设·策略模式
jiushiaifenxiang4 天前
Parallels Desktop for Mac 26.3.2 (57398)中文版新功能介绍
macos·策略模式
雪碧聊技术5 天前
什么是策略模式?一文详解
策略模式
johnny2337 天前
终端文件管理器:Yazi、nnn、Superfile、lf、Ranger、walk
策略模式
AI砖家7 天前
DeepSeek TUI 保姆级安装配置全指南 -Windows||macOS双平台全覆盖
服务器·前端·人工智能·windows·macos·ai编程·策略模式
有梦想的小何7 天前
Cursor AI 编程实战(篇三):Domain、Infrastructure 与策略模式
java·ai编程·策略模式
多加点辣也没关系8 天前
设计模式-策略模式
java·设计模式·策略模式