Cara memanggil corak strategi berdasarkan jenis masuk

王林
Lepaskan: 2024-02-08 21:12:26
ke hadapan
416 orang telah melayarinya

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
}
Salin selepas log masuk
Salin selepas log masuk
package strategy

type strategy interface {
    distribute(request model.routerequest) (*model.distributeresponse, error)
    getstrategytype() int
}
Salin selepas log masuk
Salin selepas log masuk
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
}
Salin selepas log masuk
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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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)
   },
   ...
}
Salin selepas log masuk

Kemudian hubungi:

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

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

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!