首頁  >  文章  >  後端開發  >  PHP常用六大設計模式(總結分享)

PHP常用六大設計模式(總結分享)

WBOY
WBOY轉載
2022-04-24 11:50:5811634瀏覽

本篇文章為大家帶來了關於PHP的相關知識,其中主要介紹了關於六大設計模式的相關問題,包括了單例模式、工廠模式、註冊樹模式、策略模式、適配器模式以及觀察者模式的內容,下面一起來看一下,希望對大家有幫助。

PHP常用六大設計模式(總結分享)

推薦學習:《PHP影片教學

單例模式

特點:

三私一公:私有的靜態變數(存放實例),私有的建構方法(防止建立實例),私有的複製方法(防止複製物件) ,公有的靜態方法(對外界提供實例)

應用場景:

程式應用程式中,涉及到資料庫操作時,如果每次操作的時候連接資料庫,會帶來大量的資源消耗。可以透過單例模式,建立唯一的資料庫連線物件。

<?phpclass Singleton{
    private static $_instance;
    private function __construct(){}
    private function __clone(){}
    public static function getInstance()
    {
        if(self::$_instance instanceof Singleton){//instanceof 判断一个实例是否是某个类的对象
            self::$_instance = new Singleton();
        }
        return self::$_instance;
    }}

工廠模式

特點:

將呼叫物件與建立物件分離,呼叫者直接向工廠請求,減少程式碼的耦合.提高系統的可維護性與可擴展性。

應用程式場景:

提供一種類,具有為您建立物件的某些方法,這樣就可以使用工廠類別建立對象,而不直接使用new。這樣如果想更改已建立的物件類型,只需更改該工廠即可。

//假设3个待实例化的类class Aclass{}class Bclass{}class Cclass{}class Factory{
    //定义每个类的类名
    const ACLASS = &#39;Aclass&#39;;
    const BCLASS = &#39;Bclass&#39;;
    const CCLASS = &#39;Cclass&#39;;
    public static function getInstance($newclass)
    {
        $class = $newclass;//真实项目中这里常常是用来解析路由,加载文件。
        return new $class;
    }}//调用方法:Factory::getInstance(Factory::ACLASS);

註冊樹模式

特點:

#註冊樹模式透過將物件實例註冊到一棵全域的物件樹上,需要的時候從物件樹上採摘的模式設計方法。

應用程式:

不管你是透過單例模式還是工廠模式還是二者結合產生的對象,都統統給我「插到」註冊樹上。我用某個物件的時候,直接從註冊樹上取一下就好。這和我們使用全域變數一樣的方便實用。而且註冊樹模式也為其他模式提供了一個非常好的想法。 (如下實例是單例,工廠,註冊樹的聯合使用)

//创建单例class Single{
    public $hash;
    static protected $ins=null;
    final protected function __construct(){
        $this->hash=rand(1,9999);
    }

    static public function getInstance(){
        if (self::$ins instanceof self) {
            return self::$ins;
        }
        self::$ins=new self();
        return self::$ins;
    }}//工厂模式class RandFactory{
    public static function factory(){
        return Single::getInstance();
    }}//注册树class Register{
    protected static $objects;
    public static function set($alias,$object){
        self::$objects[$alias]=$object;
    }
    public static function get($alias){
        return self::$objects[$alias];
    }
    public static function _unset($alias){
        unset(self::$objects[$alias]);
    }}//调用Register::set('rand',RandFactory::factory());$object=Register::get('rand');print_r($object);

策略模式

#定義:

定義一系列演算法,將每一個演算法封裝起來,並讓它們可以相互替換。策略模式讓演算法獨立於使用它的客戶而改變。

特點:

策略模式提供了管理相關的演算法族的辦法;策略模式提供了可以取代繼承關係的方法;使用策略模式可以避免使用多重條件轉移語句。

套用場景:

多個類別只區別在表現行為不同,可以使用Strategy模式,在執行時動態選擇具體要執行的行為。例如上學,有多種策略:走路,公車,地鐵…

abstract class Strategy{
    abstract function goSchool();}class Run extends Strategy{
    public function goSchool()
    {
        // TODO: Implement goSchool() method.
    }}class Subway extends Strategy{
    public function goSchool()
    {
        // TODO: Implement goSchool() method.
    }}class Bike extends Strategy{
    public function goSchool()
    {
        // TODO: Implement goSchool() method.
    }}class Context{
    protected $_stratege;//存储传过来的策略对象
    public function goSchoole()
    {
        $this->_stratege->goSchoole();
    }}//调用:$contenx = new Context();$avil_stratery = new Subway();$contenx->goSchoole($avil_stratery);

適配器模式

#特點:

##將各種截然不同的函數介面封裝成統一的API。

應用程式:

PHP中的資料庫操作有MySQL,MySQLi,PDO三種,可以用適配器模式統一成一致,使不同的資料庫操作,統一成一樣的API。類似的場景還有cache適配器,可以將memcache,redis,file,apc等不同的快取函數,統一成一致。

abstract class Toy{
    public abstract function openMouth();

    public abstract function closeMouth();}class Dog extends Toy{
    public function openMouth()
    {
        echo "Dog open Mouth\n";
    }

    public function closeMouth()
    {
        echo "Dog close Mouth\n";
    }}class Cat extends Toy{
    public function openMouth()
    {
        echo "Cat open Mouth\n";
    }

    public function closeMouth()
    {
        echo "Cat close Mouth\n";
    }}//目标角色(红)interface RedTarget{
    public function doMouthOpen();

    public function doMouthClose();}//目标角色(绿)interface GreenTarget{
    public function operateMouth($type = 0);}//类适配器角色(红)class RedAdapter implements RedTarget{
    private $adaptee;

    function __construct(Toy $adaptee)
    {
        $this->adaptee = $adaptee;
    }

    //委派调用Adaptee的sampleMethod1方法
    public function doMouthOpen()
    {
        $this->adaptee->openMouth();
    }

    public function doMouthClose()
    {
        $this->adaptee->closeMouth();
    }}//类适配器角色(绿)class GreenAdapter implements GreenTarget{
    private $adaptee;

    function __construct(Toy $adaptee)
    {
        $this->adaptee = $adaptee;
    }

    //委派调用Adaptee:GreenTarget的operateMouth方法
    public function operateMouth($type = 0)
    {
        if ($type) {
            $this->adaptee->openMouth();
        } else {
            $this->adaptee->closeMouth();
        }
    }}class testDriver{
    public function run()
    {
        //实例化一只狗玩具
        $adaptee_dog = new Dog();
        echo "给狗套上红枣适配器\n";
        $adapter_red = new RedAdapter($adaptee_dog);
        //张嘴
        $adapter_red->doMouthOpen();
        //闭嘴
        $adapter_red->doMouthClose();
        echo "给狗套上绿枣适配器\n";
        $adapter_green = new GreenAdapter($adaptee_dog);
        //张嘴
        $adapter_green->operateMouth(1);
        //闭嘴
        $adapter_green->operateMouth(0);
    }}//调用$test = new testDriver();$test->run();

觀察者模式

特點:

觀察者模式(Observer),當一個物件狀態改變時,依賴它的物件全部會收到通知,並自動更新。觀察者模式實現了低耦合,非侵入式的通知與更新機制。

應用程式:

一個事件發生後,要執行一連串更新操作。傳統的程式設計方式,就是在事件的程式碼之後直接加入處理的邏輯。當更新的邏輯增多之後,程式碼會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件的主體程式碼。

// 主题接口interface Subject{
    public function register(Observer $observer);
    public function notify();}// 观察者接口interface Observer{
    public function watch();}// 主题class Action implements Subject{
    public $_observers=[];
    public function register(Observer $observer){
        $this->_observers[]=$observer;
    }

    public function notify(){
        foreach ($this->_observers as $observer) {
            $observer->watch();
        }

    }}// 观察者class Cat1 implements Observer{
    public function watch(){
        echo "Cat1 watches TV<hr/>";
    }}
 class Dog1 implements Observer{
     public function watch(){
         echo "Dog1 watches TV<hr/>";
     }
 }
 class People implements Observer{
     public function watch(){
         echo "People watches TV<hr/>";
     }
 }// 调用实例$action=new Action();$action->register(new Cat1());$action->register(new People());$action->register(new Dog1());$action->notify();
推薦學習:《

PHP影片教學
#

以上是PHP常用六大設計模式(總結分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除