Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bermula dengan PHP: Corak Negeri

Bermula dengan PHP: Corak Negeri

WBOY
WBOYasal
2023-05-20 10:51:231326semak imbas

Panduan Bermula PHP: Corak Keadaan

Corak keadaan ialah corak reka bentuk gelagat yang membolehkan objek beralih antara keadaan dalaman yang berbeza, dan keadaan ini mencetuskan operasi gelagat yang berbeza. Artikel ini akan memperkenalkan konsep, pelaksanaan dan senario penggunaan corak keadaan untuk membantu pembangun PHP lebih memahami dan menggunakan corak reka bentuk penting ini.

Konsep

Corak negeri ialah corak yang dicadangkan dalam koleksi corak reka bentuk GoF. Ia terutamanya menerangkan bahawa apabila keadaan dalaman objek berubah, ia akan menyebabkan tingkah laku objek berubah. Corak keadaan boleh mengendalikan keadaan ini dan gelagat yang sepadan, dengan itu mengurangkan lebihan dan kerumitan kod.

Secara khusus, corak keadaan direka bentuk berdasarkan idea merangkum setiap keadaan dan tingkah laku yang sepadan dalam kelas yang berasingan. Dengan cara ini, peralihan antara negeri akan diselesaikan oleh kelas negeri ini, supaya perubahan negeri dapat dilaksanakan dengan cara yang lebih jelas dan ringkas. Dalam pengaturcaraan sebenar, corak keadaan boleh digunakan untuk mengendalikan antara muka pengguna, mesin keadaan, dan pelbagai proses dan senario perniagaan.

Komponen utama yang melaksanakan corak keadaan

termasuk kelas konteks, kelas abstrak nyata dan kelas keadaan konkrit. Antaranya, kelas konteks perlu merekodkan objek keadaan semasa dan menyediakan antara muka untuk peralihan keadaan luaran. Kelas abstrak keadaan mentakrifkan antara muka keadaan abstrak dan contoh operasi. Kelas keadaan tertentu melaksanakan operasi yang ditakrifkan dalam antara muka keadaan dan melaksanakan logik peralihan keadaan. Di bawah, satu contoh akan digunakan untuk menggambarkan lagi pelaksanaan corak keadaan.

Andaikan kita ingin mereka bentuk mesin keadaan ringkas untuk cawan air menggunakan corak keadaan, yang merangkumi dua keadaan: air dan tiada air, dan operasi gelagatnya yang sepadan, seperti ditunjukkan di bawah:

  1. Kelas konteks

Pertama, kita perlu mencipta kelas konteks untuk merekodkan keadaan semasa dan keadaan penukaran.

class Context
{
    private State $state;

    public function setState(State $state): void
    {
        $this->state = $state;
        $this->state->setContext($this);
    }

    public function fill(): void
    {
        $this->state->fill();
    }

    public function drink(): void
    {
        $this->state->drink();
    }
}

Dalam kelas ini, kami merekodkan keadaan dengan menetapkan kaedah setState() dan memanggil kaedah pengendalian keadaan yang sepadan apabila mengisi dan meminum.

  1. Kelas Abstrak Negeri

Seterusnya, kita perlu mentakrifkan kelas abstrak keadaan untuk mentakrifkan secara seragam antara muka semua kelas negeri.

abstract class State
{
    protected Context $context;

    public function setContext(Context $context): void
    {
        $this->context = $context;
    }

    abstract public function fill(): void;

    abstract public function drink(): void;
}

Dalam kelas abstrak ini, kami mentakrifkan kaedah setContext() untuk menetapkan objek konteks supaya objek konteksnya dan kaedah operasi keadaannya boleh dipanggil dalam kelas keadaan.

  1. Kelas keadaan khusus

Kini, kita perlu mencipta dua kelas keadaan khusus, iaitu kelas keadaan air dan kelas keadaan tanpa air. Mereka semua mewarisi daripada kelas abstrak negeri untuk melaksanakan kaedah operasi negeri yang ditakrifkan dalam kelas konteks.

class HasWaterState extends State
{
    public function fill(): void
    {
        echo "The cup is already full";
    }

    public function drink(): void
    {
        echo "Drinking water...";
        $this->context->setState(new NoWaterState());
    }
}

class NoWaterState extends State
{
    public function fill(): void
    {
        echo "Filling cup with water...";
        $this->context->setState(new HasWaterState());
    }

    public function drink(): void
    {
        echo "The cup is empty";
    }
}

Dalam dua kelas keadaan khusus ini, kami akan melaksanakan kaedah fill() dan drink() dan melakukan peralihan keadaan berdasarkan keadaan semasa. Seperti yang ditunjukkan dalam rajah di atas, apabila status cawan air adalah "air", mengisi cawan air akan mengeluarkan "cawan air penuh", manakala air minuman akan menukar status kepada "tiada air".

Senario Penggunaan

Corak keadaan boleh digunakan dalam banyak situasi berbeza, beberapa daripadanya termasuk:

  1. Peralihan Keadaan Kompleks: Apabila terdapat peralihan kompleks antara keadaan Apabila bekerja dengan perhubungan, corak keadaan membantu anda mengurus peralihan antara negeri dengan mudah.
  2. Gelagat bergantung pada keadaan: Apabila beberapa gelagat tertentu objek berubah apabila keadaan berubah, anda boleh menggunakan corak keadaan untuk mengendalikan situasi ini.
  3. Hapuskan cawangan bersyarat yang besar: Apabila sejumlah besar pernyataan cawangan bersyarat mula menjejaskan kejelasan kod, kebolehbacaan dan kebolehselenggaraan, anda boleh menggunakan corak keadaan untuk menggantikannya.
  4. Penyahgandingan: Corak keadaan boleh membantu anda mengasingkan keadaan dan gelagat yang sepadan daripada logik perniagaan utama, menjadikan kod lebih mudah untuk dikekalkan dan dilanjutkan.

Ringkasan

Corak Negeri ialah corak reka bentuk yang sangat berguna yang boleh membantu anda mengendalikan dan mengurus keadaan dalam pelbagai situasi yang berbeza. Dalam PHP, corak keadaan boleh digunakan dalam pelbagai proses dan senario perniagaan, seperti antara muka pengguna, mesin keadaan, dan pemprosesan pelbagai logik perniagaan yang kompleks. Dengan mempelajari dan menggunakan corak Negeri, anda boleh menulis kod yang lebih jelas, lebih ringkas dan lebih mudah untuk dikekalkan dan dilanjutkan.

Atas ialah kandungan terperinci Bermula dengan PHP: Corak Negeri. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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