1.1.4.3 設計模式php
設計模式,以GOF爲權威的那套有23種,雖然說設計模式是語言無關的,可是不少偏門的設計模式基本仍是在java中用的比較多html
分類java
第一部分建造類,很好理解,就是實例化或者提供對象。mysql
第二部分和也比較好理解,好可能是包裝一個對象,第三部分有一些就不是很好理解了,這得結合使用場景來看,否則光看這個概念是會很是枯燥的。sql
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');
複製代碼
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();
複製代碼
參考數據庫
記住 三私一公設計模式
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
原型模式就是複製對象,在java體系內,要單說,可是php環境,自帶的魔術方法__clone()
就解決了.....框架
爲什麼要複製對象而不是從新new呢?1種狀況是,要複製當前狀態而不是new出來的初始化狀態了,另外一種狀況是,複製比new效率高。不展開說了。ui
有三層,產出複雜的組裝對象,組裝類 建立類 產品類。是一種複雜的狀況。我以爲我2周後就會忘記....
參考設計模式的應用場景(3)--建立者模式示例代碼是java
很好理解,要點是
看鬱冬的博文或者白俊遙的文章都能理解,這個模式白俊遙寫的比較好。
也很好理解,要點
看白俊遙和鬱冬的,很清楚
跟適配器差很少,可是適配器的重點在於,輸入原對象,轉換加工。而代理的重點在於,隱藏原對象,增長中間控制。 代理模式在java中,有其餘應用,這個php弄不出來,瞭解就好,看設計模式的應用場景(8)--代理模式
都是對一個對象的包裝,裝飾器側重功能加強,適配器側重轉換爲目標格式,代理側重增長中間控制。
看php設計模式(十五)外觀模式和設計模式的應用場景(6)--外觀模式
有兩個維度能夠變化,客戶端來輸入兩個變量進行組合。 鬱冬 信息類型X速度兩個維度 白俊遙 圖案X顏色兩個維度
組合模式應該叫樹形模式,很是有特色,跟單例同樣容易識別,就是樹形結構,整體跟部分是一致的結構。
好比文件系統,無限極分類,遊戲裏的做戰單元。
享元模式叫flyweight,我嚴重懷疑是叫share!
享元模式是爲了不實例化太多類來佔用內存,怎麼避免呢?就是維護一個對象池,來複用。
觀察者是很是著名,實用,也不難理解的模式,看代碼就明白了
//主體接口
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();
複製代碼
我我的以爲跟抽象工廠的結構有點相似。 看這個代碼示例PHP設計模式--訪問者模式
責任鏈一句話就能說清楚,就是增強版的switch-case,鬱冬的例子不錯
策略模式的要點有
三個角色,命令發出者和執行者,以及命令,跟橋接有點像,也是兩個維度變化,中間一個對象耦合,可是橋接是在客戶端調用耦合,看白俊遙的例子
模板模式是定義好主體格式,而子類是隨便替換的,白俊遙有例子
我理解爲是模板的一個特例
這幾個的共同點是,有選擇,有平級備選
兩個維度組合,可是不在客戶端輸入變量,而是引入第三方類來處理
php自帶迭代器
php自帶__toString
我我的有一些分類