如何根据请求类型调用对应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 }
关键说明
- 映射表初始化:在服务实例化时,将所有策略的类型枚举值作为key,策略实例作为value存入Map,后续无需修改核心逻辑即可扩展新策略。
- 请求匹配逻辑:循环处理每个
RouteRequest时,通过routeReq.StrategyType(需确保该字段存在于RouteRequest结构体中,类型与枚举一致)直接从Map中取出对应策略,调用Distribute方法。 - 扩展性:新增策略时,只需实现
Strategy接口,在NewDistributeService中添加新策略的初始化与Map注册即可,无需修改调用逻辑。
内容的提问来源于stack exchange,提问作者Mert Özler
相关产品推荐
相关产品推荐

