首頁  >  文章  >  後端開發  >  php 設計模式(轉載)

php 設計模式(轉載)

WBOY
WBOY原創
2016-07-30 13:30:50955瀏覽

原文連結:http://www.cnblogs.com/siqi/archive/2012/09/09/2667562.html

1.單例模式

實例。

作為物件的建立模式, 單例模式確保某一個類別只有一個實例,而且自行實例化並向整個系統提供這個實例。

單例模式的要點有三個:

一是某個類別只能有一個實例;
  1. 二是它必須自行建立這個實例;
  2. 自行向整個系統提供這個實例。
  3. 為什麼要使用PHP單例模式

1. php的應用主要在於

    資料庫應用
  1. , 一個應用程式中會存在大量的資料庫操作, 在使用物件導向的方式開發時, 如果使用單例模式, 則可以避免大量的new 操作消耗的資源,還可以減少資料庫連接這樣就不容易出現too many connections情況。 2. 如果系統中需要有
  2. 一個類別來全域控制某些設定資訊
  3. , 那麼使用單例模式可以很方便的實作. 這個可以參考zend Framework的FrontController部分。 3. 在一次頁面請求中, 
  4. 便於進行調試
  5. , 因為所有的程式碼(例如資料庫操作類別db)都集中在一個類別中, 我們可以在類別中設定鉤子, 輸出日誌,從而避免到處var_dump, echo。

 範例:

/**
 * 設計模式之單例模式
 * $_instance必須宣告為靜態的私有變數
 * 建構子必須宣告為私人()方法必須設定為公有的,必須呼叫此方法以傳回實例的一個引用
 * ::運算子只能存取靜態變數和靜態函數
 * new物件都會消耗記憶體
 * 使用場景:最常用的地方是資料庫連線。
 * 使用單例模式產生一個物件後,該物件可以被其它眾多物件所使用。
 
*/
class man{
    
// ;    //建構子宣告為private,防止直接建立物件    private 
function __construct()    {     ';    }    //單例方法
    
public static      
var_dump
(isset(self::$_instance));               if(!isset(self::$_instance
))
        {               }        return self::$_instance;
}
    //阻止使用者複製物件實例    private function __clone()
   not allow' ,
E_USER_ERROR);    }    function
 test()
   function test()           
echo
("test");    }}/// ample類別的單例物件

$test = man::get_instance();$test = man::get_instance();

$test->test();();
$test->test();
一個E_USER_ERROR.//$test_clone = clone $test;




2。類別中實作
②繼承自抽象基底類別的子類別:實作基底類別中的抽象方法
③工廠類別:用以實例化所有相對應的子類別
③工廠類別:以實例化所有相對應的子類別

php 設計模式(轉載)

  •     
        /**
         * 
         * 
    */
         abstract 
    class Operation{         //         
    //無法包含函數體         abstract public function getValue(/$num1,function getValue(/$num1,function getValue(/$num1🜎    }               
         
    /*

    *      * 加法類      
    */
              public 
    function getValue($num1,$num2
    ){    +$num2;         }     }     
    */     class OperationSub extends Operation {
      
    ,
    $num2){             return
     
    $num1🎠 }
         /*
    *      * 乘法類別       Operation {         
    public function getValue($num1🠎 turn $num1*$num2
    ;         }     } 除法類別      */
         
    class
     OperationDiv ext function getValue($num1
    ,
    $num2
    ){              (
    $ num2==0){                     throw 
             }else {                                  }             } catch (Exception 
    $e){                           }         }     }





    透過採用物件導向的繼承特性,我們可以很容易就能對原有程式進行擴展,例如:'乘方','開方','對數','三角函數','統計'等,以還可以避免載入沒有必要的程式碼。

    如果我們現在需要增加一個求餘的類,會非常的簡單

    我們只需要另外寫一個類(該類繼承虛擬基類),在類中完成相應的功能(比如:求乘方的運算),而且大幅降低了耦合度,方便的日後維護及擴充

    php 設計模式(轉載)

        /*    
    */

        
    class OperationRem extends
     Operation {        public function
           return $num1%$num12;        }
    現在還有一個問題未解決,就是如何讓程式根據使用者輸入的操作符實例化對應的物件呢? 解決方法:使用一個單獨的類別來實現實例化的過程,這個類別就是工廠

    php 設計模式(轉載)     * 功能:根據輸入的運算符號,工廠就能實例化出適合的物件

         *     


    */


         

    function createObj(php 設計模式(轉載)$operate){

                

    switch ($operate){
                    
    case
     '+':🎠   
    new
     OperationAdd();                     
                        return 
    new OperationSub();                     break;                case '*':                    
    return new OperationSub();                    
    break;                
    case '/':                    return 
    new OperationDiv();                    
    break;            }
            }    }:: $result=$test
    ->getValue(23,0);    echo
     $ result;

    其他關於此模式的筆記:

    工廠模式:
    以交通工具為例子:要求請既可以定制交通工具,又可以定制交通工俱生產的過程
    1>定制交通工具
        1.定義一個接口,內含交工工具的方法(啟動運行停止)
        2.讓飛機,汽車等類去實現他們
    2> 定制工廠(通上類似)一個接口,裡麵包含交工工具的製造方法(啟動運行停止)
        2.分別寫製造飛機,汽車的工廠類別去繼承實現這個接口
     

     原地址com/thread-242243-1-1.html

    3.觀察者模式

     觀察者模式屬於行為模式,是定義對象間的一種一對多的依賴關係,以便當一個對象的狀態發生改變時,所有依賴它的物件都被通知並自動刷新。它完美的將觀察者對象和被觀察者對象分開。可以在獨立的物件(主體)中維護一個對主體感興趣的依賴項(觀察器)清單。 讓所有觀察器各自實現公共的 Observer 接口,以取消主體和依賴性物件之間的直接依賴關係。 (反正我看不明白)

    用到了spl (standard php library)

    php 設計模式(轉載)

    public function update(SplSubject $subject
    ) {        echo __CLASS__ . ' - ' . $subjectMy 
    implements SplObserver {    public function update(SplSubject 
    $subject
    ) {
            echo __CLASS__ . ' - ' . $subject
    ->getName( MySubject implements SplSubject {    private $_observers
    ; private $_name;    public
     
    function
     __construct($name  SplObjectStorage();        
    $this->_name = $name ;    }
        public function attach(SplObserver 
    $observer¦ $observer);    }    public 
    function detach(SplObserver $observer) {        
    $this->_observers->detach($observer); () {        
    foreach
     ($this->_observers  as $observer) {
                $observer->update   public 
    function
     getName() {        return $this->_name;     }
    }$observer1 = new
     MyObserver1();
    $observer2 new MySubject("test");
    $subject ->attach($observer1);$subject->attach($observer2);

    $subject

    ->notify(); 

     參考原文:http://www.php.net/manual/zh/class.splsubject.php

    策略4.模式模式在此模式中,

    演算法是從複雜類別中提取的

    ,因而可以方便地替換。例如,如果要變更搜尋引擎中排列頁的方法,則策略模式是一個不錯的選擇。思考一下搜尋引擎的幾個部分 —— 一部分遍歷頁面,一部分對每頁排列,另一部分則是根據排列的結果排序。在複雜的範例中,這些部分都在同一個類別中。透過使用策略模式,您可將排列部分放入另一個類別中,以便變更頁排列的方式,而不會影響搜尋引擎的其餘程式碼。  

    作為一個較簡單的示例,下面顯示了一個用戶列表類,它提供了一個根據

    一組即插即用的策略查找一組用戶

    的方法

    一組即插即用的策略。 //定義介面interface IStrategy {
        function filter($record); FindAfterStrategy 
    implements
     IStrategy {    private  $_name;    public 
    function __construct($name) ;    }
        public function filter($record ) {
            return strcmp ( 
    $this
    ->_name, $record); 實作介面方式1class RandomStrategy implements
     IStrategy {    public function filter($record) {        🠎return
            🠎return
            🠎1.
        }}//主類class UserList {
        private $_list = array ();
        public .      if
     (
    $names
     != null) {        ( $names as
     $name ) {                       }        }    }    
    ) {        $this->_list [] = $name;    
    $filter) {        $recs = array ();
       foreach ( $this->_list as $user ) {        
     ))                $recs [] = $user
    ;
            }
            
    return
     $recs;  array (        "Andy",
            "Jack",        "Jack",    ) );
    $f1
     = 
    $ul->find ( new FindAfterStrategy ( "J )$ FindAfterStrategy ( "J" )$); $f2
     = $ul ->find ( new RandomStrategy () );
    print_r ( 
    $f2 );  高的彈性 
    以上就介紹了php 設計模式(轉載),包含了面向的內容,希望對PHP教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn