Corak strategi: salah satu corak reka bentuk

PHPz
Lepaskan: 2023-08-28 17:54:01
asal
1041 orang telah melayarinya

Corak strategi: salah satu corak reka bentuk

Setakat ini, kami telah merangkumi tiga corak rekaan dalam siri ini. Kami mentakrifkan empat kategori corak reka bentuk yang berbeza. Dalam artikel ini, saya akan menerangkan Corak Reka Bentuk Strategik, yang tergolong dalam Corak Reka Bentuk Tingkah Laku.

Anda mungkin mempunyai soalan: Bilakah anda perlu menggunakan corak reka bentuk ini? Saya akan katakan apabila kami mempunyai pelbagai kaedah (algoritma) untuk melaksanakan operasi yang sama dan kami mahu aplikasi memilih kaedah tertentu berdasarkan parameter yang anda miliki. Mod ini juga dipanggil mod strategi.

Contoh yang sangat mudah daripada artikel ini ialah fungsi pengisihan. Sebagai contoh, kami mempunyai berbilang algoritma untuk menyusun tatasusunan, tetapi bergantung pada bilangan elemen tatasusunan, kami harus memilih algoritma yang hendak digunakan untuk mendapatkan prestasi terbaik.

Mod ini juga dipanggil mod strategi.

Soalan

Saya akan memberikan contoh laman web e-dagang yang menyepadukan berbilang gerbang pembayaran. Walaupun tapak web mempunyai berbilang gerbang pembayaran, atas permintaan, mereka tidak semuanya dipaparkan di bahagian hadapan. Sebaliknya, gerbang pembayaran yang sesuai perlu dipilih dengan segera berdasarkan jumlah troli.

Sebagai contoh mudah, jika nilai troli kurang daripada $500, pembayaran hendaklah diproses menggunakan piawaian PayPal, tetapi jika jumlahnya ialah $500 atau lebih, ia perlu diproses menggunakan butiran kad kredit yang disimpan (dengan andaian butiran telah disimpan ).

Jika strategi yang betul tidak dilaksanakan, kod kami akan kelihatan seperti ini:

Pertama, kami akan menyediakan kelas utama untuk pembayaran melalui Paypal dan pembayaran melalui kad kredit, yang akan ditambah di bawah.

// Class to pay using Credit Card
class payByCC {

    private $ccNum = '';
	private $ccType = '';
	private $cvvNum = '';
	private $ccExpMonth = '';
	private $ccExpYear = '';
	
	public function pay($amount = 0) {
		echo "Paying ". $amount. " using Credit Card";
	}
	
}

// Class to pay using PayPal
class payByPayPal {

	private $payPalEmail = '';
	
	public function pay($amount = 0) {
		echo "Paying ". $amount. " using PayPal";
	}

}

// This code needs to be repeated every place where ever needed.
$amount  = 5000;
if($amount >= 500) {
	$pay = new payByCC();
	$pay->pay($amount);
} else {
	$pay = new payByPayPal();
	$pay->pay($amount);
}
Salin selepas log masuk

Di sini, anda mungkin mengatakan bahawa kami perlu meletakkan pernyataan bersyarat untuk menjadikan kod kami berfungsi dengan betul. Bayangkan berapa banyak perubahan yang perlu anda lakukan apabila kami perlu membuat perubahan baharu pada logik itu atau anda menemui pepijat dalam logik itu. Kita perlu menambah patch pada semua tempat di mana kod ini digunakan.

Penyelesaian

Kami akan melaksanakan keperluan yang sama tetapi menggunakan corak Strategi, yang membolehkan kami menjadikan kod kami lebih jelas, lebih mudah difahami dan boleh dikembangkan.

Antaramuka

Pertama, kami akan melaksanakan antara muka yang akan digunakan oleh semua kelas gerbang pembayaran yang berbeza. Akhirnya, ini adalah strategi kami.

interface payStrategy {
    public function pay($amount);
}

class payByCC implements payStrategy {
	
	
	private $ccNum = '';
	private $ccType = '';
	private $cvvNum = '';
	private $ccExpMonth = '';
	private $ccExpYear = '';
	
	public function pay($amount = 0) {
		echo "Paying ". $amount. " using Credit Card";
	}
	
}

class payByPayPal implements payStrategy {

	private $payPalEmail = '';
	
	public function pay($amount = 0) {
		echo "Paying ". $amount. " using PayPal";
	}

}
Salin selepas log masuk

Seterusnya kami akan mencipta kelas utama kami, yang boleh menggunakan strategi yang berbeza daripada yang telah kami laksanakan setakat ini.

class shoppingCart {
    	
	public $amount = 0;
	
	public function __construct($amount = 0) {
		$this->amount = $amount;
	}
	
	public function getAmount() {
		return $this->amount;
	}
	
	public function setAmount($amount = 0) {
		$this->amount = $amount;
	}

	public function payAmount() {
		if($this->amount >= 500) {
			$payment = new payByCC();
		} else {
			$payment = new payByPayPal();
		}
		
		$payment->pay($this->amount);
		
	}
}
Salin selepas log masuk

Di sini kita dapat melihat bahawa pemuatan bersyarat kaedah pembayaran kami dilakukan dalam kaedah payAmount. Mari kita simpulkan semuanya dan lihat cara menggunakannya dengan lebih lanjut. payAmount 方法中完成的。让我们将所有内容包装在一起,看看如何进一步使用它。

interface payStrategy {
    public function pay($amount);
}

class payByCC implements payStrategy {
	
	private $ccNum = '';
	private $ccType = '';
	private $cvvNum = '';
	private $ccExpMonth = '';
	private $ccExpYear = '';
	
	public function pay($amount = 0) {
		echo "Paying ". $amount. " using Credit Card";
	}
	
}

class payByPayPal implements payStrategy {

	private $payPalEmail = '';
	
	public function pay($amount = 0) {
		echo "Paying ". $amount. " using PayPal";
	}

}

class shoppingCart {
	
	public $amount = 0;
	
	public function __construct($amount = 0) {
		$this->amount = $amount;
	}
	
	public function getAmount() {
		return $this->amount;
	}
	
	public function setAmount($amount = 0) {
		$this->amount = $amount;
	}

	public function payAmount() {
		if($this->amount >= 500) {
			$payment = new payByCC();
		} else {
			$payment = new payByPayPal();
		}
		
		$payment->pay($this->amount);
	}
}

$cart = new shoppingCart(499);
$cart->payAmount();

// Output
Paying 499 using PayPal

$cart = new shoppingCart(501);
$cart->payAmount();

//Output 
Paying 501 using Credit Card
Salin selepas log masuk

我们可以看到支付网关的翻转对于应用程序来说并不透明。根据参数,它有适当的支付网关可用于处理交易。

添加新策略

如果在后期用户需要添加具有不同逻辑的新策略(此处为新支付网关),在这种情况下会非常简单。假设我们要添加一个新的支付网关 Moneybooker,并希望在购物车金额超过 500 美元但低于 1,000 美元时处理资金。

我们需要做的就是创建一个新的策略类来实现我们的接口,我们就可以开始了。

class payByMB implements payStrategy {

    private $mbEmail = '';
	
	public function pay($amount = 0) {
		echo "Paying ". $amount. " using Money Booker";
	}

}
Salin selepas log masuk

我们现在已经准备好了新的策略类,我们需要更改的是主要的 payAmount 方法。需要修改如下:

public function payAmount() {
    
	if($this->amount > 500 && $this->amount < 1000) {
		$payment = new payByMB();
	} else if($this->amount >= 500) {
		$payment = new payByCC();
	} else {
		$payment = new payByPayPal();
	}
	
	$payment->pay($this->amount);
}
Salin selepas log masuk

在这里您可以看到我们仅在 payAmount rrreee

Kami dapat melihat bahawa peralihan gerbang pembayaran tidak telus kepada aplikasi. Bergantung pada parameter, ia mempunyai gerbang pembayaran yang sesuai tersedia untuk memproses transaksi.

Tambah strategi baharu

Jika pada peringkat kemudian pengguna perlu menambah strategi baharu dengan logik yang berbeza (di sini gerbang pembayaran baharu), ia akan menjadi sangat mudah dalam kes ini. Katakan kami ingin menambah gerbang pembayaran baharu, Moneybooker, dan ingin memproses dana apabila jumlah troli melebihi $500 tetapi jatuh di bawah $1,000.

Apa yang perlu kami lakukan ialah mencipta kelas strategi baharu yang melaksanakan antara muka kami dan kami bersedia untuk melakukannya.

rrreee

Kami kini mempunyai kelas strategi baharu kami yang sedia, yang perlu kami ubah ialah kaedah payAmount utama. Perlu diubah suai seperti berikut: 🎜 rrreee 🎜Di sini anda dapat melihat bahawa kami hanya membuat perubahan dalam kaedah payAmount, bukan dalam kod pelanggan yang memanggil kaedah tersebut. 🎜 🎜Kesimpulan🎜🎜 🎜 🎜Jadi untuk membuat kesimpulan, apabila kita mempunyai pelbagai cara untuk melaksanakan tugas yang sama (dalam bahasa perisian, apabila kita mempunyai berbilang algoritma untuk melaksanakan operasi yang sama), kita harus mempertimbangkan untuk melaksanakan corak Strategi. 🎜 🎜Dengan menggunakan mod ini, kami boleh menambah/mengalih keluar algoritma secara bebas memandangkan penukaran algoritma ini tidak telus kepada aplikasi. 🎜 🎜Saya telah mencuba yang terbaik untuk memberikan contoh asas tetapi berguna untuk menunjukkan Corak Reka Bentuk Strategi, tetapi jika anda mempunyai ulasan atau soalan tambahan, sila tambahkannya pada suapan di bawah. 🎜

Atas ialah kandungan terperinci Corak strategi: salah satu corak reka bentuk. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
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