使用策略模式 + 自动注册机制来构建旅游点评系统的搜索模块


✅ 目标:

  • 搜索模块支持不同内容类型(攻略、达人、游记等)
  • 每种搜索逻辑用一个策略类表示
  • 自动注册(基于注解 + Spring 容器)
  • 新增搜索类型时,只需添加一个类 + 一个注解,无需改工厂、注册表等!

🛠️ 技术方案:

  • Spring Boot
  • 自定义注解 @SearchType("guide") 进行标记
  • 启动时由 Spring 自动扫描并注册到 Map<String, SearchStrategy>

📁 项目结构如下(Spring Boot)

复制代码
search-system-springboot/
├── SearchSystemApplication.java
├── annotation/
│   └── SearchType.java
├── strategy/
│   ├── SearchStrategy.java
│   ├── GuideSearch.java
│   ├── ExpertSearch.java
│   ├── TravelNoteSearch.java
│   └── SearchStrategyFactory.java
└── controller/
    └── SearchController.java

✅ 关键文件内容如下:


🔹 SearchStrategy.java(策略接口)

java 复制代码
package strategy;

public interface SearchStrategy {
    void search(String keyword);
}

🔹 @SearchType 注解(用于标记策略类型)

java 复制代码
package annotation;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SearchType {
    String value(); // 类型名称,如 "guide"
}

🔹 SearchStrategyFactory.java(策略注册器)

java 复制代码
package strategy;

import annotation.SearchType;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class SearchStrategyFactory {

    @Autowired
    private ApplicationContext context;

    private final Map<String, SearchStrategy> strategyMap = new HashMap<>();

    @PostConstruct
    public void init() {
        Map<String, Object> beans = context.getBeansWithAnnotation(SearchType.class);
        for (Object bean : beans.values()) {
            Class<?> clazz = bean.getClass();
            SearchType annotation = clazz.getAnnotation(SearchType.class);
            String type = annotation.value().toLowerCase();
            strategyMap.put(type, (SearchStrategy) bean);
        }
    }

    public SearchStrategy getStrategy(String type) {
        SearchStrategy strategy = strategyMap.get(type.toLowerCase());
        if (strategy == null) {
            throw new IllegalArgumentException("不支持的搜索类型: " + type);
        }
        return strategy;
    }
}

🔹 示例策略类 GuideSearch.java

java 复制代码
package strategy;

import annotation.SearchType;
import org.springframework.stereotype.Component;

@Component
@SearchType("guide")
public class GuideSearch implements SearchStrategy {
    public void search(String keyword) {
        System.out.println("搜索攻略:" + keyword);
    }
}

🔹 示例策略类 ExpertSearch.java

java 复制代码
package strategy;

import annotation.SearchType;
import org.springframework.stereotype.Component;

@Component
@SearchType("expert")
public class ExpertSearch implements SearchStrategy {
    public void search(String keyword) {
        System.out.println("搜索达人:" + keyword);
    }
}

🔹 控制器 SearchController.java

java 复制代码
package controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import strategy.SearchStrategy;
import strategy.SearchStrategyFactory;

@RestController
@RequestMapping("/search")
public class SearchController {

    @Autowired
    private SearchStrategyFactory factory;

    @GetMapping
    public String search(@RequestParam String type, @RequestParam String keyword) {
        SearchStrategy strategy = factory.getStrategy(type);
        strategy.search(keyword);
        return "搜索成功:" + type + " -> " + keyword;
    }
}

🔹 启动类 SearchSystemApplication.java

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SearchSystemApplication {
    public static void main(String[] args) {
        SpringApplication.run(SearchSystemApplication.class, args);
    }
}

✅ 如何运行:

  1. 新建 Spring Boot 项目(Maven/Gradle 都可以)

  2. 创建上述包和类(annotationstrategycontroller

  3. 启动项目后访问:

    http://localhost:8080/search?type=guide&keyword=台北夜市

输出:

复制代码
搜索攻略:台北夜市

🚀 如何新增一个搜索类型?

比如新增 TravelNoteSearch

java 复制代码
@Component
@SearchType("travelnote")
public class TravelNoteSearch implements SearchStrategy {
    public void search(String keyword) {
        System.out.println("搜索游记:" + keyword);
    }
}

就完事了,无需改动任何已有类!开闭原则 ✔️


相关推荐
TheBestRucy1 天前
基于Dify的旅游攻略&王者荣耀攻略智能助手项目
服务器·开发语言·人工智能·python·算法·旅游
coding4u3 天前
Mac 外接显示器完全指南:从插上线到调好每个参数
macos·计算机外设·文件管理·显示器·策略模式·quick look扩展
神奇霸王龙5 天前
AgentDesk 配置 Codex+ selltoken 中转 API 实测教程(2026 年 8 月更新)
人工智能·ai·ai编程·策略模式·codex·agentdesk
tdtsmt6 天前
2026年AI眼镜核心主板PCBA供应商深度评测:天地通电子SMT贴片加工实测
人工智能·旅游
智慧景区与市集主理人9 天前
巨有科技夏季亲水度假区智慧旅游|破解旺季爆雷风险,筑牢水上游乐运营底盘
人工智能·科技·旅游
大模型momo10 天前
Spring AI 实战:多 Agent 协作实战 —— 分工拆解复杂旅游行程任务
人工智能·spring·ai·agent·旅游
赶路人儿10 天前
MacOS 下实现 AI 操控电脑(Computer Use)的思考
人工智能·macos·策略模式
Fozei10 天前
录屏原理与鼠标可视化
计算机外设·策略模式
数据皮皮侠14 天前
全国乡村旅游重点村DID数据(2000-2026)
大数据·人工智能·搜索引擎·智慧城市·制造·旅游
AIex-YH14 天前
菌种工艺四讲(三):育种工具不是“越新越好“,是“越匹配越好“
制造·策略模式