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); }
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"; } }
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); } }
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
我们可以看到支付网关的翻转对于应用程序来说并不透明。根据参数,它有适当的支付网关可用于处理交易。
添加新策略
如果在后期用户需要添加具有不同逻辑的新策略(此处为新支付网关),在这种情况下会非常简单。假设我们要添加一个新的支付网关 Moneybooker,并希望在购物车金额超过 500 美元但低于 1,000 美元时处理资金。
我们需要做的就是创建一个新的策略类来实现我们的接口,我们就可以开始了。
class payByMB implements payStrategy { private $mbEmail = ''; public function pay($amount = 0) { echo "Paying ". $amount. " using Money Booker"; } }
我们现在已经准备好了新的策略类,我们需要更改的是主要的 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); }
在这里您可以看到我们仅在 payAmount
rrreee
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 kaedahpayAmount
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Dalam rangka kerja Java, perbezaan antara corak reka bentuk dan corak seni bina ialah corak reka bentuk mentakrifkan penyelesaian abstrak kepada masalah biasa dalam reka bentuk perisian, memfokuskan pada interaksi antara kelas dan objek, seperti corak kilang. Corak seni bina mentakrifkan hubungan antara struktur sistem dan modul, memfokuskan pada organisasi dan interaksi komponen sistem, seperti seni bina berlapis.

Corak strategi dalam rangka kerja Java digunakan untuk menukar gelagat kelas secara dinamik termasuk: Rangka kerja Spring: pengesahan data dan pengurusan cache Rangka kerja JakartaEE: pengurusan transaksi dan suntikan pergantungan rangka kerja JSF: penukar dan pengesah, pengurusan kitaran hayat tindak balas.

Corak penghias ialah corak reka bentuk struktur yang membolehkan penambahan dinamik fungsi objek tanpa mengubahsuai kelas asal. Ia dilaksanakan melalui kerjasama komponen abstrak, komponen konkrit, penghias abstrak dan penghias konkrit, dan boleh mengembangkan fungsi kelas secara fleksibel untuk memenuhi keperluan yang berubah-ubah. Dalam contoh ini, penghias susu dan mocha ditambahkan pada Espresso untuk jumlah harga $2.29, menunjukkan kuasa corak penghias dalam mengubah suai gelagat objek secara dinamik.

Corak Penyesuai ialah corak reka bentuk struktur yang membolehkan objek yang tidak serasi berfungsi bersama Ia menukar satu antara muka kepada yang lain supaya objek boleh berinteraksi dengan lancar. Penyesuai objek melaksanakan corak penyesuai dengan mencipta objek penyesuai yang mengandungi objek yang disesuaikan dan melaksanakan antara muka sasaran. Dalam kes praktikal, melalui mod penyesuai, pelanggan (seperti MediaPlayer) boleh memainkan media format lanjutan (seperti VLC), walaupun ia sendiri hanya menyokong format media biasa (seperti MP3).

1. Corak kilang: Asingkan penciptaan objek dan logik perniagaan, dan cipta objek jenis tertentu melalui kelas kilang. 2. Corak pemerhati: membenarkan objek subjek memberitahu objek pemerhati tentang perubahan keadaan mereka, mencapai gandingan longgar dan corak pemerhati.

TDD digunakan untuk menulis kod PHP berkualiti tinggi Langkah-langkahnya termasuk: menulis kes ujian, menerangkan fungsi yang diharapkan dan menjadikannya gagal. Tulis kod supaya hanya kes ujian lulus tanpa pengoptimuman yang berlebihan atau reka bentuk terperinci. Selepas kes ujian lulus, optimumkan dan faktorkan semula kod untuk meningkatkan kebolehbacaan, kebolehselenggaraan dan kebolehskalaan.

Corak reka bentuk menyelesaikan cabaran penyelenggaraan kod dengan menyediakan penyelesaian yang boleh digunakan semula dan boleh diperluas: Corak Pemerhati: Membenarkan objek melanggan acara dan menerima pemberitahuan apabila ia berlaku. Corak Kilang: Menyediakan cara terpusat untuk mencipta objek tanpa bergantung pada kelas konkrit. Corak Singleton: memastikan bahawa kelas hanya mempunyai satu contoh, yang digunakan untuk mencipta objek yang boleh diakses secara global.

Kelebihan menggunakan corak reka bentuk dalam rangka kerja Java termasuk: kebolehbacaan kod yang dipertingkatkan, kebolehselenggaraan dan kebolehskalaan. Kelemahan termasuk kerumitan, overhed prestasi dan keluk pembelajaran yang curam akibat penggunaan berlebihan. Kes praktikal: Mod proksi digunakan untuk malas memuatkan objek. Gunakan corak reka bentuk dengan bijak untuk memanfaatkan kelebihannya dan meminimumkan kelemahannya.
