Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Analisis mendalam tentang corak kaedah templat dalam PHP

Analisis mendalam tentang corak kaedah templat dalam PHP

青灯夜游
青灯夜游ke hadapan
2021-07-23 19:25:482307semak imbas

Dalam artikel sebelumnya "Fahami corak fasad dalam PHP dalam satu artikel " kami memperkenalkan corak fasad dalam PHP Artikel ini akan membawa anda memahami corak kaedah templat dalam corak reka bentuk PHP.

Analisis mendalam tentang corak kaedah templat dalam PHP

Corak kaedah templat juga merupakan salah satu corak yang sering kita gunakan secara tidak sengaja. Model ini adalah tafsiran warisan yang terbaik. Apabila terdapat tindakan berulang dalam subkelas, ia diekstrak dan diletakkan dalam kelas induk untuk pemprosesan bersatu Ini adalah penjelasan yang paling mudah dan paling popular tentang corak kaedah templat. Sama seperti apabila kita biasanya melakukan projek, proses setiap projek sebenarnya adalah sama, termasuk penyelidikan, pembangunan, ujian, penggunaan dan proses dalam talian. Dalam setiap projek, pelaksanaan proses ini tidak akan sama. Proses ini seperti kaedah templat, membolehkan kita berkembang mengikut proses ini setiap masa.

Rajah dan penjelasan kelas Gof

Takrifan GoF: Takrifkan rangka algoritma dalam operasi, sambil menangguhkan beberapa langkah ke subkelas . TemplateMethod membenarkan subkelas untuk mentakrifkan semula langkah-langkah tertentu algoritma tanpa mengubah struktur algoritma.

Rajah kelas GoF

Analisis mendalam tentang corak kaedah templat dalam PHP

Pelaksanaan kod

abstract class AbstractClass
{
    public function TemplateMethod()
    {
        $this->PrimitiveOperation1();
        $this->PrimitiveOperation2();
    }

    abstract public function PrimitiveOperation1();
    abstract public function PrimitiveOperation2();
}

Tentukan kelas abstrak dengan kaedah templat TemplateMethod(), di mana kita panggil kaedah operasi algoritma. Kaedah abstrak algoritma ini dilaksanakan dalam subkelas.

class ConcreteClassA extends AbstractClass
{
    public function PrimitiveOperation1()
    {
        echo '具体类A实现方法1', PHP_EOL;
    }
    public function PrimitiveOperation2()
    {
        echo '具体类A实现方法2', PHP_EOL;
    }
}

class ConcreteClassB extends AbstractClass
{
    public function PrimitiveOperation1()
    {
        echo '具体类B实现方法1', PHP_EOL;
    }
    public function PrimitiveOperation2()
    {
        echo '具体类B实现方法2', PHP_EOL;
    }
}

Kelas pelaksanaan khusus, mereka hanya perlu melaksanakan algoritma yang ditakrifkan oleh kelas induk.

$c = new ConcreteClassA();
$c->TemplateMethod();

$c = new ConcreteClassB();
$c->TemplateMethod();

Dalam panggilan pelanggan, subkelas dijadikan instantiated, tetapi kaedah templat kelas induk yang diwarisi oleh subkelas dipanggil. Panggilan algoritma bersatu boleh dicapai.

  • Saya percaya bahawa sesiapa yang telah melakukan beberapa pembangunan berorientasikan objek akan sedikit sebanyak menggunakan corak kaedah templat. Kerana ia adalah perkara biasa
  • Dalam sesetengah rangka kerja, sesetengah kelas berfungsi selalunya mempunyai fungsi pemulaan, dan banyak fungsi dalaman lain dipanggil dalam fungsi pemula Ini sebenarnya adalah aplikasi corak kaedah templat
  • Corak kaedah templat boleh melaksanakan fungsi cangkuk dengan mudah. Sama seperti banyak templat atau fungsi cangkuk yang disediakan untuk anda dalam sistem sumber terbuka. Sebagai contoh, sesetengah program sumber terbuka blog akan menempah beberapa ruang pengiklanan atau fungsi cangkuk di lokasi khas untuk pengguna melaksanakan atas permintaan
  • Corak kaedah templat sesuai untuk: melaksanakan bahagian algoritma yang tidak berubah pada satu masa, dan Bahagian pembolehubah diserahkan kepada subkelas untuk melaksanakan; " Prinsipnya ialah "Jangan datang kepada kami, kami datang kepada anda"
Dalam syarikat, saya sangat mengesyorkan pengurusan projek tangkas. Sudah tentu, ini tidak bermakna pengurusan projek tradisional . Seteruk mana pun, cuma tangkas lebih sesuai untuk syarikat jangka pendek, rata dan pantas seperti kami. Dalam tangkas, kami menggunakan rangka kerja Scurm, yang sebenarnya adalah templat. Ia mentakrifkan empat jenis mesyuarat, tiga jenis orang dan tiga alat. Dalam pelaksanaan khusus setiap projek, kami akan mematuhi peraturan ini, tetapi pelaksanaan khusus tidak akan sama. Contohnya, kadangkala kita berulang seminggu sekali, dan kadangkala kita berulang sebulan sekali. Kadang-kadang kita tidak memerlukan mesyuarat retrospektif, tetapi mengadakan mesyuarat retrospektif dan semak bersama-sama. Walau apa pun, kami akan melaksanakan pembangunan projek yang fleksibel berdasarkan Scurm. Sebagai pemimpin, saya hanya perlu memanggil proses asas Scurm dalam setiap projek. Oleh itu, kekuatan syarikat tidak dapat dipisahkan daripada pembelajaran semua orang Sudah tentu, perkara yang berguna mesti dipelajari, dikongsi dan diterapkan sepanjang masa! !

Kod penuh: https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method.php

Instance

Tiada lagi mesej teks Kali ini kami melaksanakan bahagian permulaan kelas Cache. Sama seperti kelas alat dalam beberapa rangka kerja yang disebutkan di atas. Secara amnya, kami akan menggunakan Memcached atau Redis untuk melaksanakan Cache, jadi kami mengekstrak kelas Cache awam, dan kemudian membiarkan kelas pelaksanaan Cache Memcached dan Redis mewarisinya. Dalam kelas awam, beberapa kerja permulaan kelas pelaksanaan dilakukan melalui kaedah templat Tugas-tugas ini dipanggil secara seragam oleh kelas induk Kelas pelaksanaan hanya perlu melaksanakan kandungan khusus setiap langkah.

Cache gambarajah kelas

Analisis mendalam tentang corak kaedah templat dalam PHP

Kod sumber penuh: https://github.com/zhangyue0503/designpatterns-php / blob/master/20.template-method/source/template-method-cache.php

<?php

abstract class Cache
{
    private $config;
    private $conn;

    public function __construct()
    {
        $this->init();
    }
    public function init()
    {
        $this->GetConfig();
        $this->OpenConnection();
        $this->CheckConnection();
    }

    abstract public function GetConfig();
    abstract public function OpenConnection();
    abstract public function CheckConnection();
}

class MemcachedCache extends Cache
{
    public function GetConfig()
    {
        echo &#39;获取Memcached配置文件!&#39;, PHP_EOL;
        $this->config = &#39;memcached&#39;;
    }
    public function OpenConnection()
    {
        echo &#39;链接memcached!&#39;, PHP_EOL;
        $this->conn = 1;
    }
    public function CheckConnection()
    {
        if ($this->conn) {
            echo &#39;Memcached连接成功!&#39;, PHP_EOL;
        } else {
            echo &#39;Memcached连接失败,请检查配置项!&#39;, PHP_EOL;
        }
    }
}

class RedisCache extends Cache
{
    public function GetConfig()
    {
        echo &#39;获取Redis配置文件!&#39;, PHP_EOL;
        $this->config = &#39;redis&#39;;
    }
    public function OpenConnection()
    {
        echo &#39;链接redis!&#39;, PHP_EOL;
        $this->conn = 0;
    }
    public function CheckConnection()
    {
        if ($this->conn) {
            echo &#39;Redis连接成功!&#39;, PHP_EOL;
        } else {
            echo &#39;Redis连接失败,请检查配置项!&#39;, PHP_EOL;
        }
    }
}

$m = new MemcachedCache();

$r = new RedisCache();
Penerangan

  • Kami telah melaksanakan kelas cache yang begitu mudah. Adakah ia sangat serupa dengan kod dalam banyak rangka kerja?
  • Subkelas hanya perlu mentakrifkan pelaksanaannya sendiri, dan selebihnya kod berulang diserahkan kepada kelas induk Jika tiada kelas induk, mereka semua perlu melaksanakan kaedah init() sendiri
  • Sudah tentu, apabila anda perlu menambah kelas pelaksanaan lain, anda hanya perlu mewarisi kelas induk Cache ini dan menyelesaikan pelaksanaan anda sendiri. Klien boleh menghadapi kelas pelaksanaan ini dengan mudah kerana mereka tahu bahawa mereka hanya perlu memanggil permulaan dahulu . Kaedah boleh menggunakan kelas ini, tidak kira kelas pelaksanaan yang mana, ia adalah sama

Alamat asal: https://juejin.cn/post/6844903989348139021

Pengarang : Pengurus projek tegar

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Analisis mendalam tentang corak kaedah templat dalam PHP. 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