Rumah >pembangunan bahagian belakang >tutorial php >Apakah corak keadaan dalam PHP? Belajar melalui contoh

Apakah corak keadaan dalam PHP? Belajar melalui contoh

青灯夜游
青灯夜游ke hadapan
2021-07-27 18:33:362164semak imbas

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 🎜>

Apakah corak keadaan dalam PHP? Belajar melalui contohCorak 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 Gof

Takrifan GoF: membenarkan objek menukar gelagatnya apabila keadaan dalamannya berubah. Objek nampaknya telah mengubah suai kelasnya

Rajah kelas GoF

Apakah corak keadaan dalam PHP? Belajar melalui contoh

Pelaksanaan 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
  • Jadi apakah maksud corak keadaan? Contoh rajah kelas lalai ini terlalu mudah Sebenarnya, tujuan sebenar corak keadaan adalah untuk menyelesaikan masalah kompleks jika bersarang dimasukkan ke dalam kelas keadaan luaran satu demi satu contoh berikut Kita akan melihat bahawa
  • terpakai untuk: kelakuan objek bergantung pada keadaannya, dan ia mesti mengubah kelakuannya mengikut keadaan pada masa jalankan sesuatu operasi mengandungi sejumlah besar berbilang cawangan pernyataan bersyarat, dan Cawangan ini bergantung pada keadaan objek
  • Ciri-ciri corak keadaan ialah: ia menyetempatkan tingkah laku yang berkaitan dengan keadaan tertentu ia menjadikan objek keadaan boleh dikongsi;
  • Biasa ditemui dalam sistem pesanan, sistem keahlian dan sistem OA, iaitu apabila pelbagai perubahan status berlaku dalam proses, corak status boleh digunakan untuk reka bentuk dan seni bina keseluruhan
Kami telah menyesuaikan sistem pusat beli-belah kami sendiri dalam sistem telefon mudah alih, supaya anda boleh membuat pesanan dan membeli produk kami dengan mudah pada telefon bimbit anda. Pesanan (Konteks) akan mempunyai berbilang negeri (Negeri), seperti belum dibayar, berbayar, pesanan selesai, pesanan dibayar balik dan banyak negeri. Kami meletakkan negeri ini dalam kelas negeri yang sepadan untuk dilaksanakan Kelas negeri yang berbeza akan memanggil tindakan negeri seterusnya. Contohnya, selepas pembayaran, tunggu penerimaan barang dan selepas bayaran balik, tunggu pembeli mengisi. borang logistik Tunggu, dengan cara ini, mod negeri boleh digunakan secara fleksibel di pusat membeli-belah kami! !

Kod penuh: https://github.com/zhangyue0503/designpatterns-php/blob/master/22.state/source/state.php

Contoh

Biasanya akan ada sistem keahlian dalam aplikasi pusat beli-belah Secara amnya, ahli dengan tahap yang lebih tinggi boleh menikmati lebih banyak diskaun Pada masa ini, menggunakan mod status dengan mudah mendapat keahlian diskaun tahap. Sudah tentu, perkara yang paling penting ialah menggunakan mod status, anda hanya boleh menambah subkelas status diskaun ahli yang sepadan apabila anda perlu menambah atau memadam tahap keahlian. Tiada kod perniagaan lain yang perlu diubah, mari kita lihat pelaksanaan khusus!

Gambar Diskaun Ahli

Apakah corak keadaan dalam PHP? Belajar melalui 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 &#39;当前会员&#39; . $m->GetScore() . &#39;积分,折扣为:&#39; . $m->discount(), PHP_EOL;

$m->SetScore(990);
echo &#39;当前会员&#39; . $m->GetScore() . &#39;积分,折扣为:&#39; . $m->discount(), PHP_EOL;

$m->SetScore(660);
echo &#39;当前会员&#39; . $m->GetScore() . &#39;积分,折扣为:&#39; . $m->discount(), PHP_EOL;

$m->SetScore(10);
echo &#39;当前会员&#39; . $m->GetScore() . &#39;积分,折扣为:&#39; . $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
  • Pada masa yang sama, ini juga menjadikan kaedah lebih lama dan lebih lama dan lebih banyak sukar untuk dikekalkan. mod terbaik Dipilih, iaitu, kelakuan objek seperti yang dinyatakan di atas bergantung pada keadaannya
  • Alamat asal: https://juejin.cn/post/6844903991562731534
  • Pengarang: Pengurus Projek Tegar
  • 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!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam