Maison  >  Article  >  développement back-end  >  Comment appeler un modèle de stratégie en fonction du type entrant

Comment appeler un modèle de stratégie en fonction du type entrant

王林
王林avant
2024-02-08 21:12:26400parcourir

Comment appeler un modèle de stratégie en fonction du type entrant

L'éditeur php Youzi vous présentera comment appeler le modèle de stratégie en fonction du type entrant. Le modèle de stratégie est un modèle de conception orienté objet qui permet de sélectionner différents algorithmes ou stratégies en fonction de différentes situations. Dans le développement réel, nous devons souvent effectuer différentes opérations basées sur différents types. En utilisant le modèle de stratégie, nous pouvons encapsuler ces différentes opérations dans différentes classes de stratégies et appeler les stratégies correspondantes en fonction des types entrants pour obtenir un contrôle logique flexible. Ensuite, nous détaillerons comment utiliser le modèle de stratégie en PHP pour appeler la stratégie appropriée en fonction du type entrant.

Contenu des questions

J'ai deux stratégies. Sur la base des données demandées, je souhaite appeler la stratégie souhaitée et effectuer l'action sur une seule ligne. Comment puis-je atteindre cet objectif ? Mon code jusqu'à présent est comme ça

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
}

Mes 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
}

Il y a quelques années, j'ai réalisé une opération en utilisant make[]. J'ai pu créer la politique appropriée et effectuer des actions basées sur les paramètres de la demande en les faisant correspondre à l'énumération. Je ne m'en souviens plus maintenant et je ne trouve aucun exemple sur Internet. Pouvez-vous m'aider?

Solution

Vous pouvez mettre toutes les stratégies disponibles sur la carte :

var strategies = map[int]func(repository.repository) strategy {
   enum.branch: func(repo repository.repository) strategy {
      return newdistributebranchstrategy(repo)
   },
   ...
}

Alors appelez :

s, ok: = strategies[x]
if !ok {
  // error
}
s(repo).Distribute(...)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer