国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP常用的三種設(shè)計模式匯總

2024-05-04 23:49:26
字體:
供稿:網(wǎng)友

本篇文章是學(xué)習(xí)PHP中常用的三種設(shè)計模式的筆記及總結(jié),不管采用哪一門語言開發(fā)什么,幾乎都會使用到設(shè)計模式,我們?yōu)槭裁葱枰O(shè)計模式呢?它的誕生對于我們開發(fā)人員來說有什么樣的作用與意義呢?

相信做iOS開發(fā)的人員對設(shè)計模式也會挺熟悉吧?比如單例設(shè)計模式、工廠設(shè)計模式、觀察者模式、MVC框架結(jié)構(gòu)設(shè)計模式等。

接下來我們一起來學(xué)習(xí)PHP中最常用的三種設(shè)計模式:單例設(shè)計模式、工廠設(shè)計模式和觀察者設(shè)計模式。

單例設(shè)計模式

所謂單例模式,即在應(yīng)用程序中最多只有該類的一個實例存在,一旦創(chuàng)建,就會一直存在于內(nèi)存中!

單例設(shè)計模式常應(yīng)用于數(shù)據(jù)庫類設(shè)計,采用單例模式,只連接一次數(shù)據(jù)庫,防止打開多個數(shù)據(jù)庫連接。

一個單例類應(yīng)具備以下特點:

單例類不能直接實例化創(chuàng)建,而是只能由類本身實例化。因此,要獲得這樣的限制效果,構(gòu)造函數(shù)必須標(biāo)記為private,從而防止類被實例化。

需要一個私有靜態(tài)成員變量來保存類實例和公開一個能訪問到實例的公開靜態(tài)方法。

在PHP中,為了防止他人對單例類實例克隆,通常還為其提供一個空的私有__clone()方法。

單例模式的例子:

 <?php /*** Singleton of Database*/class Database{  // We need a static private variable to store a Database instance.  privatestatic $instance;   // Mark as private to prevent it from being instanced.  privatefunction__construct()  {    // Do nothing.  }   privatefunction__clone()   {    // Do nothing.  }   publicstatic functiongetInstance()   {    if (!(self::$instanceinstanceofself)) {      self::$instance = newself();    }     returnself::$instance;  }} $a =Database::getInstance();$b =Database::getInstance(); // truevar_dump($a === $b); 

工廠設(shè)計模式

工廠設(shè)計模式常用于根據(jù)輸入?yún)?shù)的不同或者應(yīng)用程序配置的不同來創(chuàng)建一種專門用來實例化并返回其對應(yīng)的類的實例。

我們舉例子,假設(shè)矩形、圓都有同樣的一個方法,那么我們用基類提供的API來創(chuàng)建實例時,通過傳參數(shù)來自動創(chuàng)建對應(yīng)的類的實例,他們都有獲取周長和面積的功能。

 <?php interfaceInterfaceShape { functiongetArea(); functiongetCircumference();} /*** 矩形*/class Rectangle implementsInterfaceShape{  private $width;  private $height;    publicfunction__construct($width, $height)  {    $this->width = $width;    $this->height = $height;  }   publicfunctiongetArea()   {    return $this->width* $this->height;  }   publicfunctiongetCircumference()  {    return 2 * $this->width + 2 * $this->height;  }} /*** 圓形*/class Circle implementsInterfaceShape{  private $radius;   function__construct($radius)  {    $this->radius = $radius;  }    publicfunctiongetArea()   {    return M_PI * pow($this->radius, 2);  }   publicfunctiongetCircumference()  {    return 2 * M_PI * $this->radius;  }} /*** 形狀工廠類*/class FactoryShape {   publicstatic functioncreate()  {    switch (func_num_args()) {      case1:      return newCircle(func_get_arg(0));      case2:      return newRectangle(func_get_arg(0), func_get_arg(1));      default:        # code...        break;    }  } } $rect =FactoryShape::create(5, 5);// object(Rectangle)#1 (2) { ["width":"Rectangle":private]=> int(5) ["height":"Rectangle":private]=> int(5) }var_dump($rect);echo "<br>"; // object(Circle)#2 (1) { ["radius":"Circle":private]=> int(4) }$circle =FactoryShape::create(4);var_dump($circle); 

觀察者設(shè)計模式

觀察者模式是挺常見的一種設(shè)計模式,使用得當(dāng)會給程序帶來非常大的便利,使用得不當(dāng),會給后來人一種難以維護的想法。

什么是觀察者模式?一個對象通過提供方法允許另一個對象即觀察者 注冊自己)使本身變得可觀察。當(dāng)可觀察的對象更改時,它會將消息發(fā)送到已注冊的觀察者。這些觀察者使用該信息執(zhí)行的操作與可觀察的對象無關(guān)。結(jié)果是對象可以相互對話,而不必了解原因。觀察者模式是一種事件系統(tǒng),意味著這一模式允許某個類觀察另一個類的狀態(tài),當(dāng)被觀察的類狀態(tài)發(fā)生改變的時候,觀察類可以收到通知并且做出相應(yīng)的動作;觀察者模式為您提供了避免組件之間緊密耦??聪旅胬幽憔兔靼琢耍?/p>

 <?php /*觀察者接口*/interfaceInterfaceObserver{  functiononListen($sender, $args);  functiongetObserverName();} // 可被觀察者接口interfaceInterfaceObservable{  functionaddObserver($observer);  functionremoveObserver($observer_name);} // 觀察者抽象類abstractclass Observer implementsInterfaceObserver{  protected $observer_name;   functiongetObserverName()   {    return $this->observer_name;  }   functiononListen($sender, $args)  {   }} // 可被觀察類abstractclass Observable implementsInterfaceObservable {  protected $observers = array();   publicfunctionaddObserver($observer)   {    if ($observerinstanceofInterfaceObserver)     {      $this->observers[] = $observer;    }  }   publicfunctionremoveObserver($observer_name)   {    foreach ($this->observersas $index => $observer)     {      if ($observer->getObserverName() === $observer_name)       {        array_splice($this->observers, $index, 1);        return;      }    }  }} // 模擬一個可以被觀察的類class A extendsObservable {  publicfunctionaddListener($listener)   {    foreach ($this->observersas $observer)     {      $observer->onListen($this, $listener);    }  }} // 模擬一個觀察者類class B extendsObserver {  protected $observer_name = 'B';   publicfunctiononListen($sender, $args)   {    var_dump($sender);    echo "<br>";    var_dump($args);    echo "<br>";  }} // 模擬另外一個觀察者類class C extendsObserver {  protected $observer_name = 'C';   publicfunctiononListen($sender, $args)   {    var_dump($sender);    echo "<br>";    var_dump($args);    echo "<br>";  }} $a = new A();// 注入觀察者$a->addObserver(new B());$a->addObserver(new C()); // 可以看到觀察到的信息$a->addListener('D'); // 移除觀察者$a->removeObserver('B'); // 打印的信息:// object(A)#1 (1) { ["observers":protected]=> array(2) { [0]=> object(B)#2 (1) { ["observer_name":protected]=> string(1) "B" } [1]=> object(C)#3 (1) { ["observer_name":protected]=> string(1) "C" } } }// string(1) "D"// object(A)#1 (1) { ["observers":protected]=> array(2) { [0]=> object(B)#2 (1) { ["observer_name":protected]=> string(1) "B" } [1]=> object(C)#3 (1) { ["observer_name":protected]=> string(1) "C" } } }// string(1) "D" 

小結(jié)

初入PHP的世界,目前只了解這些基本的設(shè)計模式,慢慢學(xué)著去應(yīng)用!如果文中有不對之處,請在評論中指出,我會在明確之后更正文章內(nèi)容!


注:相關(guān)教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 贵阳市| 昔阳县| 沅江市| 定襄县| 古浪县| 石门县| 承德县| 财经| 巴青县| 炎陵县| 阳信县| 左贡县| 日喀则市| 辽阳县| 奉化市| 麻城市| 梁平县| 谷城县| 沂南县| 武清区| 砚山县| 周口市| 翁牛特旗| 小金县| 桦川县| 理塘县| 马关县| 无棣县| 沙雅县| 微山县| 北流市| 津市市| 新安县| 肇庆市| 梅州市| 通化县| 双流县| 蒲城县| 闸北区| 泸定县| 刚察县|