代理模式
也叫做委托模式皇钞,為其它對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)
代理模式的幾種類型:
1,遠(yuǎn)程代理挑童,也就是為了一個(gè)對(duì)象在不同地址空間提供局部代表旬牲。隱藏一個(gè)對(duì)象存在于不同地址空間的事實(shí)废酷。
2,虛擬代理淋昭,根據(jù)需要來(lái)創(chuàng)建開(kāi)銷很大的對(duì)象遂黍,通過(guò)它來(lái)存放實(shí)例化需要很長(zhǎng)時(shí)間的真實(shí)對(duì)象终佛。
3,安全代理,用來(lái)控制真實(shí)對(duì)象的訪問(wèn)對(duì)象雾家。
4,智能指引铃彰,當(dāng)調(diào)用真實(shí)對(duì)象的時(shí)候,代理處理一些事情榜贴。
數(shù)據(jù)庫(kù)讀寫(xiě)分離(PDO方式豌研,測(cè)試數(shù)據(jù)為之前適配器模式建的user表)
目錄結(jié)構(gòu)
|proxy #項(xiàng)目根目錄
|--Think #核心類庫(kù)
|----Database #數(shù)據(jù)操作類庫(kù)
|------readerDB.php #讀數(shù)據(jù)庫(kù)類
|------writerDb.php #寫(xiě)程序類庫(kù)
|----main #核心類庫(kù)
|------Loder.php #自動(dòng)加載類
|------proxy.php #代理類
|--index.php #單一的入口文件
代碼實(shí)踐
讀數(shù)據(jù)庫(kù)類 Think/Database/readerDB.php (數(shù)據(jù)庫(kù)操作類,使用了単例模式)
<?php
namespace Think\Database;
class readerDB{
private static $_instance; //私有化屬性存放實(shí)例
private static $conn; //用于存放連接讀數(shù)據(jù)庫(kù)句柄
private function __construct($host, $user, $passwd, $dbname) {
//鏈接數(shù)據(jù)庫(kù)
self::$conn = new \PDO("mysql:host={$host}; dbname={$dbname}", $user, $passwd);
}
private function __clone() {
// TODO: Implement __clone() method.
}
public function getInstance($host, $user, $passwd, $dbname) {
//如果不是當(dāng)前類的實(shí)例唬党,那么實(shí)例化當(dāng)前類創(chuàng)建新實(shí)例
if(!self::$_instance instanceof self){
self::$_instance = new self($host, $user, $passwd, $dbname);
}
return self::$_instance;
}
//查詢單條記錄
public function query($sql) {
return self::$conn->query($sql)->fetch();
}
}
寫(xiě)數(shù)據(jù)庫(kù)類 Think/Database/wirterDB.php
<?php
namespace Think\Database;
class wirterDB{
private static $_instance; //私有化屬性存放實(shí)例
private static $conn; //用于存放連接讀數(shù)據(jù)庫(kù)句柄
private function __construct($host, $user, $passwd, $dbname) {
//鏈接數(shù)據(jù)庫(kù)
self::$conn = new \PDO("mysql:host={$host}; dbname={$dbname}", $user, $passwd);
}
private function __clone() {
// TODO: Implement __clone() method.
}
public function getInstance($host, $user, $passwd, $dbname) {
//如果不是當(dāng)前類的實(shí)例鹃共,那么實(shí)例化當(dāng)前類創(chuàng)建新實(shí)例
if(!self::$_instance instanceof self){
self::$_instance = new self($host, $user, $passwd, $dbname);
}
return self::$_instance;
}
//寫(xiě)數(shù)據(jù)
public function exec($sql) {
return self::$conn->exec($sql);
}
}
代理類 Think/proxy.php
<?php
/**
* 代理類
*/
namespace Think;
use Think\Database\readerDB;
use Think\Database\wirterDB;
class proxy{
protected $reader;
protected $wirter;
public function __construct() {
$this->reader = readerDB::getInstance('127.0.0.1','root','123456','test');
$this->wirter = wirterDB::getInstance('127.0.0.2','root','123456','test');
}
public function query($sql) {
if(substr($sql, 0, 6) == 'select'){
echo '讀操作'.PHP_EOL;
return $this->reader->query($sql);
}else{
echo '寫(xiě)操作'.PHP_EOL;
return $this->wirter->exec($sql);
}
}
}
自動(dòng)加載類 Think/Loder.php
<?php
namespace Think;
class Loder{
static function autoload($class){
require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
}
}
入口文件 index.php
<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');
$db = new \Think\proxy();
$test = $db->query("select * from user where id = 1");
print_r($test);
輸出
讀操作
Array
(
[id] => 1
[0] => 1
[name] => Mask
[1] => Mask
[passwd] => 827ccb0eea8a706c4c34a16891f84e7b
[2] => 827ccb0eea8a706c4c34a16891f84e7b
[created_time] => 1528851788
[3] => 1528851788
)