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.
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?
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!