You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据请求类型调用对应Strategy模式实现

策略模式匹配与调用实现

核心思路

用**映射表(Map)**将策略类型枚举与对应的策略实例绑定,初始化时完成所有策略的注册,后续只需通过请求中的策略类型值直接从Map中获取实例并调用方法,实现一行代码完成匹配+调用逻辑。

修改后的服务类代码

package service

import (
    "fmt"
    "github.com/x/internal/model"
    "github.com/x/internal/repository"
    "github.com/x/internal/strategy"
    "github.com/x/internal/strategy/strategies"
)

type DistributeService struct {
    repo         repository.Repository
    strategyMap  map[int]strategy.Strategy // key为策略枚举值,value为对应策略实例
}

type Distribute interface {
    Distribute(vehicleNumberPlate string, request model.DistributeRequest) (*model.DistributeResponse, error)
}

func NewDistributeService(repo repository.Repository) *DistributeService {
    // 初始化所有策略实例
    branchStrategy := strategies.NewDistributeBranchStrategy(repo)
    transferCenterStrategy := strategies.NewDistributeTransferCenterStrategy(repo)

    // 构建策略映射表
    strategyMap := make(map[int]strategy.Strategy)
    strategyMap[branchStrategy.GetStrategyType()] = branchStrategy
    strategyMap[transferCenterStrategy.GetStrategyType()] = transferCenterStrategy

    return &DistributeService{
        repo:        repo,
        strategyMap: strategyMap,
    }
}

func (d *DistributeService) Distribute(vehicleNumberPlate string, request model.DistributeRequest) (*model.DistributeResponse, error) {
    var responses []*model.DistributeResponse
    for _, routeReq := range request.RouteRequest {
        // 一行代码完成策略匹配与方法调用(含基础错误检查)
        if strat, ok := d.strategyMap[routeReq.StrategyType]; ok {
            resp, err := strat.Distribute(routeReq)
            if err != nil {
                return nil, err
            }
            responses = append(responses, resp)
        } else {
            return nil, fmt.Errorf("unsupported strategy type: %d", routeReq.StrategyType)
        }
    }

    // 根据业务需求组装最终响应
    return &model.DistributeResponse{
        RouteResponses: responses,
    }, nil
}

关键说明

  1. 映射表初始化:在服务实例化时,将所有策略的类型枚举值作为key,策略实例作为value存入Map,后续无需修改核心逻辑即可扩展新策略。
  2. 请求匹配逻辑:循环处理每个RouteRequest时,通过routeReq.StrategyType(需确保该字段存在于RouteRequest结构体中,类型与枚举一致)直接从Map中取出对应策略,调用Distribute方法。
  3. 扩展性:新增策略时,只需实现Strategy接口,在NewDistributeService中添加新策略的初始化与Map注册即可,无需修改调用逻辑。

内容的提问来源于stack exchange,提问作者Mert Özler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:02:52