[TOC]
## :-: 基本的設計模式
1. 工廠模式
說明:工廠方法或者類生成對象,而不是在代碼中直接new
2. 單例模式
說明:使某個類的對象僅允許創建一個
代碼:
~~~
class Database
{
private static $db;
private function __construct()//把構造方法定義為私有的,這樣在類外就不能通過new關鍵字來實例化一個類
{
}
static function getInstance()
{
if (self::$db) {
return self::$db;
} else {
self::$db = new self();
return self::$db;
}
}
}
~~~
3. 注冊模式
說明:全局共享和交換對象
代碼:
~~~
class register
{
private static $objects;
static function set($alias, $object)//把對象掛到注冊樹上
{
self::$objects[$alias] = $object;
}
static function get($name)//獲得注冊樹上的對象
{
return self::$objects[$name];
}
function _unset($alias)//把對象從注冊數上移除
{
unset(self::$objects[$alias]);
}
}
~~~
4. 適配器模式
說明:可以將截然不同的函數接口封裝成統一的API
實際應用舉例:PHP的數據庫操作有mysql,mysqli,pdo3種,可以用適配器模式統一成一致。類似的場景還有cache適配器,將memcache,redis,file,apc等不同的緩存函數,統一成一致的
代碼:
~~~
首先:通過實現接口可以實現封裝成統一的API
interface IDatabase
{
function connect($host, $user, $passwd, $dbname);
function query($sql);
function close();
}
//mysql的用法,實現接口,統一接口
class MySQL implements IDatabase
{
protected $conn;
function connect($host, $user, $passwd, $dbname)
{
$conn = mysql_connect($host, $user, $passwd);
mysql_select_db($dbname, $conn);
$this->conn = $conn;
}
function query($sql)
{
$res = mysql_query($sql, $this->conn);
return $res;
}
function close()
{
mysql_close($this->conn);
}
}
//mysqli的用法
class MySQLi implements IDatabase
{
protected $conn;
function connect($host, $user, $passwd, $dbname)
{
$conn = mysqli_connect($host, $user, $passwd, $dbname);
$this->conn = $conn;
}
function query($sql)
{
return mysqli_query($this->conn, $sql);
}
function close()
{
mysqli_close($this->conn);
}
}
//pdo的用法
class Pdo implements IDatabase
{
protected $conn;
function connect($host, $user, $passwd, $dbname)
{
$conn = new \Pdo("mysql:host=$host;dbname=$dbname", $user, $passwd);
$this->conn = $conn;
}
function query($sql)
{
return $this->conn->query($sql);
}
function close()
{
unset($this->conn);
}
}
~~~
5. 策略模式
說明:將一組特定的行為和算法封裝成類,以適應某些特定的上下文環境,這種模式就是策略模式。
實際應用舉例:假如一個電商網站系統,針對男性女性用戶要各自跳轉到不同的商品類目,并且所有的廣告位展示不同的廣告。
作用:使用策略模式可以實現Ioc,依賴倒置,控制反轉
代碼:
~~~
interface UserStrategy
{
function showAd();
function showCategory();
}
class MaleUserStrategy implements UserStrategy
{
function showAd()
{
echo '2019男裝';
}
function showCategory()
{
echo '男裝';
}
}
~~~
6. 數據對象映射模式
說明:是將對象和數據存儲映射起來,對一個對象的操作會映射為對數據存儲的操作。也就是對對象的操作會映射為數據庫中的一條記錄
實際應用舉例:在代碼中實現數據對象映射模式,我們將實現一個ORM類,將復雜的SQL語句映射成對象屬性的操作。
代碼:
~~~
$user = new User2(1);
$user->name = 'test';
$user->mobile = '';
$user->regtime = date('Y-m-d H:i:s');
class User
{
public $id;
public $name;
public $mobile;
public $regtime;
protected $db;
function __construct($id)
{
$this->db = new MySQLi();
$this->db->connect('127.0.0.1','root','123','test');
$res = $this->db->query("select * from user where id='{$id}' limit 1");
$data = $res->fetch_assoc();
$this->id = $data['id'];
$this->name = $data['name'];
$this->mobile = $data['mobile'];
$this->regtime = $data['regtime'];
}
function __destruct()
{
$this->db->query("update user set name = '{$this->name}',
mobile = '{$this->mobile}',regtime = '{$this->regtime}' where id = '{$this->id}' limit 1");
}
}
7. 觀察者模式
說明:當一個對象狀態發生改變的時,依賴它的對象全部會收到通知,并自動更新
場景:一個事件發生后,要執行一連串更新操作。傳統的編程方式,就是在事件的代碼之后直接加入處理的邏輯。當更新的邏輯增多之后,代碼會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件主體的代碼。
作用:觀察者模式實現了低耦合,非侵入式的通知與更新機制。
代碼:
~~~
abstract class EventGenerator//事件發生者(發生事件)
{
private $observers = array();
function addObserver(Observer $observer)//添加觀察者
{
$this->observers[] = $observer;
}
function notify()//通知觀察者
{
foreach ($this->observers as $observer)
{
$observer->update();
}
}
}
interface Observer//觀察者,觀察的對象就是剛才的事件發生者
{
function update($event_info = null);//
}
class Event extends EventGenerator//事件,繼承事件發生者
{
function trigger()
{
echo '事件發生<br>/n';
$this->notify();//通知觀察者
}
}
$event = new Event();
$event->addObserver(new Observer1);
$event->addObserver(new Observer2);
$event->trigger();
~~~
8. 原型模式
說明:與工廠模式作用類似,都是用來創建對象。與工廠模式的實現不同,原型模式是先創建好一個原型對象,然后通過clone原型對象來創建新的對象。這樣就免去了類創建時重復的初始化操作。原型對象適用于大對象的創建。創建一個大對象需要很大的開銷,如果每次new就會消耗很大,原型模式僅需要內存拷貝即可。
9. 裝飾器模式
說明:可以動態的添加修改類的功能。
作用:一個類提供了一項功能,如果要在修改并添加額外的功能,傳統的編程方式,需要寫一個子類繼承它,并重新實現類的方法。使用裝飾器模式,僅需要運行時添加一個裝飾器對象即可實現,可以實現最大的靈活性。
10. 迭代器模式
說明:在不需要了解內部實現的前提下,遍歷一個聚合對象的內部元素。相比于傳統的編程模式,迭代器模式可以隱藏遍歷元素的所需要的操作。
11. 代理模式
說明:在客戶端與實體之間建立一個代理對象(proxy),客戶端對實體進行操作全部委派給代理對象,隱藏實現的具體實現細節。Proxy還可以與業務代碼分離,部署到另外的服務器。業務代碼中通過RPC來委派任務。
- PHP操作集合
- 獲取字符首字母
- PHP實現定時備份MySQL數據庫
- PHP定時發送郵件
- PHP基本語法
- 總結
- 命名空間
- 錯誤抑制符
- 位運算符
- 原碼,反碼,補碼
- traits
- PHP的反射機制
- const和define的區別
- 語法
- 常用的函數
- 1.變量及打印函數
- 2.引入文件
- 3.常量
- 4.錯誤處理
- 5.面向對象
- 數據結構與算法
- 結構
- 數組
- 索引
- 散列表(哈希表)
- 棧
- 隊列
- 鏈表
- 算法
- 排序算法
- 插入排序
- 冒泡排序
- 選擇排序
- 歸并排序
- 快速排序
- 查找算法
- 二分查找
- 二分查找變形版本1:查詢數據在序列中第一次出現
- 哈希算法
- 算法復雜度
- Smarty模板引擎
- composer
- yaf
- yaf的安裝配置
- 其它
- Java
- JavaSE
- 1.Java發展及JDK安裝配置
- 2.Eclipse的下載及安裝
- 3.Java開發基礎
- 虛擬機
- 2.編輯虛擬機設置
- 1.虛擬機下安裝centos
- 3.安裝vmtools
- Linux
- 1.vi和vim編輯器
- 2.開機、重啟和用戶登錄注銷
- 3.用戶管理
- 4.用戶組管理
- 5.用戶和組的相關文件
- 6.linux運行級別
- 7.幫助指令
- 8.文件目錄類指令
- 9.時間日期類
- 10.搜索查找類
- 11.壓縮和解壓縮
- 12.組管理和權限管理(難點,重點)
- 虛擬主機的配置
- phpstudy快捷配置
- 配置文件配置
- PHP面向對象高級特性
- SPL標準庫(PHP標準庫)
- PHP鏈式操作的實現
- 面向對象編程的基本原則
- 設計模式
- 基本的設計模式