Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara memanggil corak strategi berdasarkan jenis masuk

Cara memanggil corak strategi berdasarkan jenis masuk

王林
王林ke hadapan
2024-02-08 21:12:26400semak imbas

Cara memanggil corak strategi berdasarkan jenis masuk

editor php Youzi akan memperkenalkan anda cara memanggil corak strategi berdasarkan jenis yang masuk. Corak strategi ialah corak reka bentuk berorientasikan objek yang membolehkan algoritma atau strategi yang berbeza dipilih mengikut situasi yang berbeza. Dalam pembangunan sebenar, kita sering perlu melakukan operasi yang berbeza berdasarkan jenis yang berbeza. Dengan menggunakan corak strategi, kita boleh merangkum operasi yang berbeza ini ke dalam kelas strategi yang berbeza dan memanggil strategi yang sepadan berdasarkan jenis yang masuk untuk mencapai kawalan logik yang fleksibel. Seterusnya, kami akan memperincikan cara menggunakan corak strategi dalam PHP untuk memanggil strategi yang sesuai berdasarkan jenis yang masuk.

Kandungan soalan

Saya ada dua strategi. Berdasarkan data yang diminta, saya ingin memanggil strategi yang saya inginkan dan melakukan tindakan dalam satu baris. Bagaimanakah saya boleh mencapai matlamat ini? Kod saya setakat ini adalah seperti ini

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
}

Perkhidmatan saya:

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
}

Beberapa tahun lalu, saya melakukan pembedahan menggunakan make[]. Saya dapat mencipta dasar yang berkaitan dan melakukan tindakan berdasarkan parameter dalam permintaan dengan memadankannya dengan penghitungan. Saya tidak dapat mengingatnya sekarang dan saya tidak dapat mencari sebarang contoh di internet. boleh tolong saya?

Penyelesaian

Anda boleh meletakkan semua strategi yang ada ke dalam peta:

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

Kemudian hubungi:

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

Atas ialah kandungan terperinci Cara memanggil corak strategi berdasarkan jenis masuk. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam