英文:
How to call Strategy pattern based on incoming type
问题
我有两种策略。根据请求的数据,我想调用我想要的策略并在一行中执行操作。我该如何实现这个?到目前为止,我的代码是这样的:
package strategy
type Strategy interface {
Distribute(request model.RouteRequest) (*model.DistributeResponse, error)
GetStrategyType() int
}
package strategy
type Strategy interface {
Distribute(request model.RouteRequest) (*model.DistributeResponse, error)
GetStrategyType() int
}
package strategies
import (
"github.com/x/internal/enum"
"github.com/x/internal/model"
"github.com/x/internal/repository"
)
type DistributeBranchStrategy struct {
repo repository.Repository
}
func NewDistributeBranchStrategy(repo repository.Repository) *DistributeBranchStrategy {
return &DistributeBranchStrategy{
repo: repo,
}
}
func (d *DistributeBranchStrategy) Distribute(request model.RouteRequest) (*model.DistributeResponse, error) {
return nil, nil
}
func (d *DistributeBranchStrategy) GetStrategyType() int {
return enum.BRANCH
}
package strategies
import (
"github.com/x/internal/enum"
"github.com/x/internal/model"
"github.com/x/internal/repository"
)
type DistributeTransferCenterStrategy struct {
repo repository.Repository
}
func NewDistributeTransferCenterStrategy(repo repository.Repository) *DistributeTransferCenterStrategy {
return &DistributeTransferCenterStrategy{
repo: repo,
}
}
func (d *DistributeTransferCenterStrategy) Distribute(request model.RouteRequest) (*model.DistributeResponse, error) {
return nil, nil
}
func (d *DistributeTransferCenterStrategy) GetStrategyType() int {
return enum.TRANSFER_CENTER
}
我的服务:
package service
import (
"github.com/x/internal/model"
"github.com/x/internal/repository"
"github.com/x/internal/strategy/strategies"
)
type DistributeService struct {
repo repository.Repository
distributeBranchStrategy strategies.DistributeBranchStrategy
}
type Distribute interface {
Distribute(vehicleNumberPlate string, request model.DistributeRequest) *model.DistributeResponse
}
func NewDistributeService(repo repository.Repository, strategy strategies.DistributeBranchStrategy) *DistributeService {
return &DistributeService{
repo: repo,
distributeBranchStrategy: strategy,
}
}
func (d *DistributeService) Distribute(vehicleNumberPlate string, request model.DistributeRequest) *model.DistributeResponse {
// TODO: Implement this method
for _, x := range request.RouteRequest {
d.distributeBranchStrategy.Distribute(x)
}
return nil
}
多年前,我使用make[]
进行了一次操作。我能够根据请求中的参数,通过将其与枚举匹配,创建相关的策略并执行操作。我现在记不清了,也找不到任何关于这方面的例子。你能帮帮我吗?
英文:
I have 2 strategies. According to the data from the request, I want to call the strategy I want and perform operations in a single line. How can I achieve this? So far my code is like this
package strategy
type Strategy interface {
Distribute(request model.RouteRequest) (*model.DistributeResponse, error)
GetStrategyType() int
}
package strategy
type Strategy interface {
Distribute(request model.RouteRequest) (*model.DistributeResponse, error)
GetStrategyType() int
}
package strategies
import (
"github.com/x/internal/enum"
"github.com/x/internal/model"
"github.com/x/internal/repository"
)
type DistributeBranchStrategy struct {
repo repository.Repository
}
func NewDistributeBranchStrategy(repo repository.Repository) *DistributeBranchStrategy {
return &DistributeBranchStrategy{
repo: repo,
}
}
func (d *DistributeBranchStrategy) Distribute(request model.RouteRequest) (*model.DistributeResponse, error) {
return nil, nil
}
func (d *DistributeBranchStrategy) GetStrategyType() int {
return enum.BRANCH
}
package strategies
import (
"github.com/x/internal/enum"
"github.com/x/internal/model"
"github.com/x/internal/repository"
)
type DistributeTransferCenterStrategy struct {
repo repository.Repository
}
func NewDistributeTransferCenterStrategy(repo repository.Repository) *DistributeTransferCenterStrategy {
return &DistributeTransferCenterStrategy{
repo: repo,
}
}
func (d *DistributeTransferCenterStrategy) Distribute(request model.RouteRequest) (*model.DistributeResponse, error) {
return nil, nil
}
func (d *DistributeTransferCenterStrategy) GetStrategyType() int {
return enum.TRANSFER_CENTER
}
MY service:
package service
import (
"github.com/x/internal/model"
"github.com/x/internal/repository"
"github.com/x/internal/strategy/strategies"
)
type DistributeService struct {
repo repository.Repository
distributeBranchStrategy strategies.DistributeBranchStrategy
}
type Distribute interface {
Distribute(vehicleNumberPlate string, request model.DistributeRequest) *model.DistributeResponse
}
func NewDistributeService(repo repository.Repository, strategy strategies.DistributeBranchStrategy) *DistributeService {
return &DistributeService{
repo: repo,
distributeBranchStrategy: strategy,
}
}
func (d *DistributeService) Distribute(vehicleNumberPlate string, request model.DistributeRequest) *model.DistributeResponse {
// TODO: Implement this method
for _, x := range request.RouteRequest {
d.distributeBranchStrategy.Distribute(x)
}
return nil
}
Years ago I made an operation using make[] . I was able to create the relevant strategy and perform the operations by matching it with an enum according to a parameter in the request. I can't remember it right now, I couldn't find any examples on the internet. Can you help me?
答案1
得分: 2
你可以将所有可用的策略放在一个映射中:
var strategies = map[int]func(repository.Repository) Strategy {
enum.BRANCH: func(repo repository.Repository) Strategy {
return NewDistributeBranchStrategy(repo)
},
...
}
然后调用:
s, ok := strategies[x]
if !ok {
// 错误处理
}
s(repo).Distribute(...)
英文:
You can put all available strategies in a map:
var strategies = map[int]func(repository.Repository) Strategy {
enum.BRANCH: func(repo repository.Repository) Strategy {
return NewDistributeBranchStrategy(repo)
},
...
}
Then call:
s, ok: = strategies[x]
if !ok {
// error
}
s(repo).Distribute(...)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论