php設計模式學習筆記

1.1.4.3 設計模式php

設計模式,以GOF爲權威的那套有23種,雖然說設計模式是語言無關的,可是不少偏門的設計模式基本仍是在java中用的比較多html

分類java

第一部分建造類,很好理解,就是實例化或者提供對象。mysql

第二部分和也比較好理解,好可能是包裝一個對象,第三部分有一些就不是很好理解了,這得結合使用場景來看,否則光看這個概念是會很是枯燥的。sql

1建造類

1.0簡單工廠

class Mysql{

}
class Sqllite{

}
class Factory{
    public static function getDb($type){
        switch($type){
            case 'mysql':
                return new Mysql();
                break;
            case 'sqllite':
                return new Sqllite();
                break;
        }
    }
}
//客戶端
$db = Factory::getDb('mysql');
複製代碼
  • 就是很簡單
  • 優勢是簡單
  • 缺點是要增長數據庫種類就要改代碼,擴展性很差,違反開閉原則。

1.1工廠

interface Factory{
    public static function getDb();
}
class MysqlFactory implements Factory{
    public static function getDb(){
        return new Mysql();
    }
}
class SqlliteFactory implements Factory{
    public static function getDb(){
        return new Sqllite();
    }
}
//配置文件 
//$dbfatory=MysqlFactory
//客戶端
$db = $dbfatory::getDb();
複製代碼
  • 1加了一個層級,2將變量用配置文件形式提出,是簡單工廠的升級版,是經常使用,實用的一個設計模式
  • 優勢是 符合開閉原則,擴展性好

1.2抽象工廠

  • 代碼太複雜了,不寫了
  • 工廠模式的工廠,是有一個接口和各個實現兩層,抽象工廠是給產品給建立了這樣的兩個層級,而後就是(工廠X產品)2個維度,產品有幾種是寫死的,工廠能夠增長,大概就是這樣,適用於複雜狀況

參考數據庫

1.3單例

記住 三私一公設計模式

class Fcactory{
    private static $instance = null;
    private fucntion __constructe(){}
    private fucntion __clone(){}
    public fucntion getInstacne()
    {
        if(empty(self::instance)){
            self::instance = new Test();
        }
        return self::instance;
    }
}
//客戶端
$obj1 = Factory::getInstance();
$obj2 = Factory::getInstance();
echo $obj1 == $obj2?1:0;
複製代碼

單例模式是,最最經常使用的模式了,也很是有特色,很是容易識別,基本操做。bash

1.4原型

原型模式就是複製對象,在java體系內,要單說,可是php環境,自帶的魔術方法__clone()就解決了.....框架

爲什麼要複製對象而不是從新new呢?1種狀況是,要複製當前狀態而不是new出來的初始化狀態了,另外一種狀況是,複製比new效率高。不展開說了。ui

參考php設計模式(八)原型模式

1.5建造者

有三層,產出複雜的組裝對象,組裝類 建立類 產品類。是一種複雜的狀況。我以爲我2周後就會忘記....

參考設計模式的應用場景(3)--建立者模式示例代碼是java

建造類總結

2結構類

2.1裝飾器

很好理解,要點是

  1. 要裝飾器和本體要繼承一個接口,從而保持對外的一致性
  2. 裝飾器接受一個本體實例,進行屬性的裝飾

看鬱冬的博文或者白俊遙的文章都能理解,這個模式白俊遙寫的比較好。

2.2適配器

也很好理解,要點

  1. 輸入原對象,包裝後跟原對象保持一致
  2. 在包裝器額外寫一個轉換邏輯

看白俊遙和鬱冬的,很清楚

2.3代理

跟適配器差很少,可是適配器的重點在於,輸入原對象,轉換加工。而代理的重點在於,隱藏原對象,增長中間控制。 代理模式在java中,有其餘應用,這個php弄不出來,瞭解就好,看設計模式的應用場景(8)--代理模式

裝飾器 適配器 代理總結

都是對一個對象的包裝,裝飾器側重功能加強,適配器側重轉換爲目標格式,代理側重增長中間控制。

2.4外觀

  • 雖然叫外觀,也叫門面,可是我以爲一點也不貼切,實際上是把某個動做提出來,放到一個類,來解耦。
  • 優勢是對外變得簡潔,避免暴露內部信息和複雜邏輯。
  • 裝飾器,適配器,代理是對一個對象化的包裝,而外觀是對一個或多個對象的包裝。
  • 缺點,很差修改

php設計模式(十五)外觀模式設計模式的應用場景(6)--外觀模式

2.5橋接

有兩個維度能夠變化,客戶端來輸入兩個變量進行組合。 鬱冬 信息類型X速度兩個維度 白俊遙 圖案X顏色兩個維度

2.6組合

組合模式應該叫樹形模式,很是有特色,跟單例同樣容易識別,就是樹形結構,整體跟部分是一致的結構。

好比文件系統,無限極分類,遊戲裏的做戰單元。

2.7享元

享元模式叫flyweight,我嚴重懷疑是叫share!

享元模式是爲了不實例化太多類來佔用內存,怎麼避免呢?就是維護一個對象池,來複用。

白俊遙的例子

結構類總結

  • 三個包裝模式 裝飾器 適配器和代理,都比較好理解
  • 外觀模式,是對多個對象的包裝,或者對一個操做,一個子系統的包裝,是實用的模式
  • 橋接是兩個維度的變化,我沒用過
  • 組合是樹形結構,跟單例同樣容易識別
  • 享元是對象池,複用

3行爲類

3.1觀察者

觀察者是很是著名,實用,也不難理解的模式,看代碼就明白了

//主體接口
interface Subject{
    public function register(Observer $observer);
    public function notify();
}
//觀察者接口
interface Observer{
    public function watch(){;
}

//主體
class Test implements Subjetc{
    private $observers = [];
    public function register(Observer $observer){
        $this->observers[] = $observer;
    }
    public function notify(){
        foreach($this->observers as $v){
            $v—>watch();
        }
    }
}
//觀察者1
class Dog implements Observer{
    public function watch(){
        echo 'dog is copy!';
    }
}
//觀察者2
class Cat implements Observer{
    public function watch(){
        echo 'cat is copy!';
    }
}

//客戶端調用
$main_subject = new Test();
$main_subject->register(new Dog());
$main_subject->register(new Cat());
$main_subject->notify();
複製代碼

3.2訪問者

我我的以爲跟抽象工廠的結構有點相似。 看這個代碼示例PHP設計模式--訪問者模式

3.3責任鏈

責任鏈一句話就能說清楚,就是增強版的switch-case,鬱冬的例子不錯

3.4策略

策略模式的要點有

  • 有主體和平級的選項,
  • 能夠切換選項
  • 重點在於選擇

鬱冬的例子不錯

3.5命令

三個角色,命令發出者和執行者,以及命令,跟橋接有點像,也是兩個維度變化,中間一個對象耦合,可是橋接是在客戶端調用耦合,看白俊遙的例子

3.6模板

模板模式是定義好主體格式,而子類是隨便替換的,白俊遙有例子

3.7解釋器

我理解爲是模板的一個特例

策略 模板 解釋器 總結

這幾個的共同點是,有選擇,有平級備選

  • 策略的側重是選擇的靈活性
  • 模板的側重是,框架是肯定的,子類是可替換的
  • 解釋器就是一種模板,框架的主要方法就是翻譯,子類

3.8調停者

兩個維度組合,可是不在客戶端輸入變量,而是引入第三方類來處理

3.9迭代器

php自帶迭代器

3.10備忘錄

php自帶__toString

3.11狀態

設計模式的應用場景(15)--狀態模式

總結

我我的有一些分類

參考

相關文章
相關標籤/搜索