Home >Backend Development >Golang >How to call strategy pattern based on incoming type

How to call strategy pattern based on incoming type

王林
王林forward
2024-02-08 21:12:26463browse

How to call strategy pattern based on incoming type

php editor Youzi will introduce you how to call the strategy mode based on the incoming type. Strategy pattern is an object-oriented design pattern that allows different algorithms or strategies to be selected according to different situations. In actual development, we often need to perform different operations based on different types. By using the strategy pattern, we can encapsulate these different operations into different strategy classes and call the corresponding strategies based on the incoming types to achieve flexible logic control. Next, we will detail how to use the strategy pattern in PHP to call the appropriate strategy based on the incoming type.

Question content

I have two strategies. Based on the requested data, I want to call my desired strategy and perform the action in one line. How can I achieve this goal? My code so far 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 services:

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
}

A few years ago, I performed an operation using make[]. I was able to create the relevant policy and perform actions based on the parameters in the request by matching them with the enumeration. I can't remember it now and I can't find any examples on the internet. Can you help me?

Workaround

You can put all available strategies into the 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(...)

The above is the detailed content of How to call strategy pattern based on incoming type. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete