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(); } }
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(); } }
$c = new Context(); $stateA = new ConcreteStateA(); $c->SetState($stateA); $c->Request(); $c->Request(); $c->Request(); $c->Request();
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;
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!