Rumah >pembangunan bahagian belakang >tutorial php >Apakah corak keadaan dalam PHP? Belajar melalui contoh
Dalam artikel sebelumnya "Mari bincangkan tentang corak tunggal dalam PHP" kami memperkenalkan corak tunggal dalam PHP Artikel ini akan membawa anda memahami corak keadaan dalam corak reka bentuk PHP 🎜>
Corak status tidak begitu mudah untuk difahami secara literal. Apakah maksud status di sini? Simpan status? Itu bukan mod memo. Sebenarnya, keadaan di sini ialah keadaan kelas Dengan menukar keadaan kelas tertentu, kelas itu berasa seperti kelas yang berbeza. Agak sukar untuk mengatakannya, jadi mari kita pelajari konsepnya dahulu dan kemudian baca kemudian.
Rajah dan penjelasan kelas GofTakrifan GoF: membenarkan objek menukar gelagatnya apabila keadaan dalamannya berubah. Objek nampaknya telah mengubah suai kelasnya
Rajah kelas GoFPelaksanaan kod
Kelas konteks, yang juga boleh dianggap sebagai kelas sasaran, mempunyai objek keadaan di dalamnya. Apabila memanggil Request(), panggil kaedah Handle() kelas status. Tujuannya ialah perubahan dalam keadaan kelas konteks semasa dikawal oleh kelas keadaan luaran.
class Context { private $state; public function SetState(State $state): void { $this->state = $state; } public function Request(): void { $this->state = $this->state->Handle(); } }Antara muka keadaan abstrak dan dua pelaksanaan konkrit. Kedua-dua pelaksanaan khusus ini sebenarnya memanggil satu sama lain. Kesan pelaksanaan ialah setiap kali kelas konteks memanggil kaedah Request(), kelas keadaan dalaman bertukar kepada keadaan lain. Ia seperti suis yang bertukar-tukar antara hidup dan mati.
interface State { public function Handle(): State; } class ConcreteStateA implements State { public function Handle(): State { echo '当前是A状态', PHP_EOL; return new ConcreteStateB(); } } class ConcreteStateB implements State { public function Handle(): State { echo '当前是B状态', PHP_EOL; return new ConcreteStateA(); } }Pelaksanaan klien, nyatakan objek konteks dan tetapkan keadaan awal, dan kemudian panggil objek Request() secara berterusan untuk mencapai keadaan suis.
$c = new Context(); $stateA = new ConcreteStateA(); $c->SetState($stateA); $c->Request(); $c->Request(); $c->Request(); $c->Request();Adakah anda nampak jalannya? Di sini, perubahan keadaan dirangkumkan ke dalam kelas pelaksanaan luaran Pensuisan keadaan tidak dilakukan dalam konteks atau kelas sasaran
Kod penuh: https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state.php
Contoh
Kod sumber penuh: https://github.com/zhangyue0503/designpatterns-php / blob/master/22.state/source/state-member.php
<?php class Member { private $state; private $score; public function SetState($state) { $this->state = $state; } public function SetScore($score) { $this->score = $score; } public function GetScore() { return $this->score; } public function discount() { return $this->state->discount($this); } } interface State { public function discount($member); } class PlatinumMemeberState implements State { public function discount($member) { if ($member->GetScore() >= 1000) { return 0.80; } else { $member->SetState(new GoldMemberState()); return $member->discount(); } } } class GoldMemberState implements State { public function discount($member) { if ($member->GetScore() >= 800) { return 0.85; } else { $member->SetState(new SilverMemberState()); return $member->discount(); } } } class SilverMemberState implements State { public function discount($member) { if ($member->GetScore() >= 500) { return 0.90; } else { $member->SetState(new GeneralMemberState()); return $member->discount(); } } } class GeneralMemberState implements State { public function discount($member) { return 0.95; } } $m = new Member(); $m->SetState(new PlatinumMemeberState()); $m->SetScore(1200); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL; $m->SetScore(990); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL; $m->SetScore(660); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL; $m->SetScore(10); echo '当前会员' . $m->GetScore() . '积分,折扣为:' . $m->discount(), PHP_EOL;Penjelasan
Jika anda tidak menggunakan mod keadaan, dalam kaedah Diskaun() Ahli, kita mungkin perlu menulis banyak lapisan jika...lain...syarat penghakiman
Pembelajaran yang disyorkan: "Tutorial Video PHP"
Atas ialah kandungan terperinci Apakah corak keadaan dalam PHP? Belajar melalui contoh. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!