【淺談設計模式(二)】讓你一分鐘讀懂設計模式

best輝發表於2018-11-30

碎碎念:
在此分享的是我學習中的一些理解和總結,大家一起學習和共勉,希望對大家有所幫助;在大家看了以後,覺得我理解和總結有不到位或者不對的地方希望大家在留言區指出,我會及時修改,感謝!!!

前言:
這篇文章接續上一篇文章,上一篇主要分享的是設計模式-工廠模式,篇幅較長,如果有沒有看過第一篇文章的朋友,下面有連結(淺談設計模式(一))。該篇主要分享的設計模式是:單例模式和介面卡模式。分享的每個設計模式都會通過3個方面(定義、舉例說明、程式碼說明)進行講解和說明。

【淺談設計模式(一)】:https://learnku.com/articles/17805

正文:
單例模式
1.定義:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。
2.舉例說明:Windows 是多程式多執行緒的,在操作一個檔案的時候,就不可避免地出現多個程式或執行緒同時操作一個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。 或者一些裝置管理器常常設計為單例模式,比如一個電腦有兩臺印表機,在輸出的時候就要處理不能兩臺印表機列印同一個檔案。
3.程式碼說明:

 <?php 
  class Singleton
  {
      private static $instance;
      //私有構造方法,禁止使用new建立物件
      private function __construct(){}
      //例項化化物件
      public static function getInstance(){
          if (!isset(self::$instance)) {   //判斷是否例項化
              self::$instance = new self;   
          }
          return self::$instance;
      }
      //將克隆方法設為私有,禁止克隆物件
      private function __clone(){}

      public function operation()
      {
          echo "這裡可以新增其他方法和操作 <br>";
      }
  }

  $shiyanlou = Singleton::getInstance();
  $shiyanlou->operation();

這裡多補充一點單例模式的特點:
(1)單例類只能有一個例項。
(2)單例類必須自己建立自己的唯一例項。
(3)單例類的建構函式定義為private私有方法。
(4)單例類必須自行向整個系統提供這個例項。

介面卡模式
個人理解:通俗點就是使用不同的方法名實現同一個功能
1.定義:將一個類的介面轉換成客戶希望的另外一個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
2.舉例說明:小明有一輛遙控玩具汽車,它可以向前進,向後退,左拐,右拐(這裡只以前進作為舉例)。小明對遙控汽車進行前進操作,只需要呼叫forward()方法即可。這時候小明的基友小李和妹子小唐也想要操作玩具汽車前進,但小李他只會呼叫didForward()方法,小唐她只會呼叫doForward()。這個時候如何才能讓小李實現對遙控汽車的前進操作呢?要實現它,可以使用介面卡模式來實現。(即:如何讓小李和小唐在不改變呼叫方法的情況下,也可以操作玩具車前進)

<說明>(這裡有點抽象,結合下面程式碼進行理解)
(1)目標(Target)角色:定義客戶端使用的與特定領域相關的介面,這也就是我們所期待得到的這裡的小李和小唐要求實現的相關介面。我們可以看到LiTarget和TangTarget必須實現didForward和doForward方法
(2)源(Adaptee)角色:需要進行適配的介面,這裡的源角色是小明的Car例項
(3)介面卡(Adapter)角色:對Adapter的介面與Target介面進行適配;介面卡是本模式的核心,介面卡把源介面轉換成目標介面,此角色為具體類LiAdapter實現了LiTarget介面,建立時接收一個Car例項。
3.程式碼說明:
a.小明操作玩具汽車的方法:

abstract class Toy
{
    public abstract function forward();
}
class Car extends Toy  
{
    public function forward()
    {
        echo "Car forward \n";  //前進
    }
}

//小明操作玩具車
$car = new Car();
$car->forward();  //玩具車前進

b.介面卡介面:

//小李請求的介面方法  
interface LiTarget  
{  
    public function didForward();   
} 
//小唐請求的介面方法  
interface TangTarget  
{  
    public function doForward();   
} 

//類介面卡角色:小李
class LiAdapter implements LiTarget  
{  
    private $adaptee;  
    function __construct(Car $car)  
    {  
        $this->adaptee = $car;   
    }  
    public function didForward()    
    {  
        $this->adaptee->forward();    //玩具車前進
    }  
} 
//類介面卡角色:小唐
class TangAdapter implements TangTarget  
{  
    private $adaptee;  
    function __construct(Car $car)  
    {  
        $this->adaptee = $car;   
    }  
    public function doForward()    
    {  
        $this->adaptee->forward();    //玩具車前進
    }  
} 

c.小李操作玩具汽車前進:

//小李呼叫
$car = new Car();   //例項化源角色類
$Li = new LiAdapter($car);  //呼叫介面類
$Li->didForward(); //前進
//小唐呼叫
$car = new Car();   //例項化源角色類
$Tang = new TangTarget($car);  //呼叫介面類
$Tang->doForward(); //前進

這樣介面卡就實現了我們需要的結果,小李只呼叫didForward()方法就可以操作玩具車前進,小唐只呼叫doForward()也可以操作玩具車前進。
其實設計模式學著感覺也不是很難,但是關鍵要用到專案中的話,確實要花點心思去設計和分析的!
下一篇分享:觀察者模式和策略模式
上一篇分享:【淺談設計模式(一)】:https://learnku.com/articles/17805

相關文章