php設(shè)計(jì)模式之代理模式

代理模式

也叫做委托模式皇钞,為其它對(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
)

上一篇 php設(shè)計(jì)模式之原型模式
下一篇 php設(shè)計(jì)模式之外觀模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驶拱,隨后出現(xiàn)的幾起案子霜浴,更是在濱河造成了極大的恐慌,老刑警劉巖蓝纲,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阴孟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡税迷,警方通過(guò)查閱死者的電腦和手機(jī)永丝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)箭养,“玉大人慕嚷,你說(shuō)我怎么就攤上這事”厦冢” “怎么了喝检?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)撼泛。 經(jīng)常有香客問(wèn)我挠说,道長(zhǎng),這世上最難降的妖魔是什么愿题? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任损俭,我火速辦了婚禮蛙奖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撩炊。我一直安慰自己外永,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布拧咳。 她就那樣靜靜地躺著伯顶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骆膝。 梳的紋絲不亂的頭發(fā)上祭衩,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音阅签,去河邊找鬼掐暮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛政钟,可吹牛的內(nèi)容都是我干的路克。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼养交,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼精算!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起碎连,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤灰羽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鱼辙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體廉嚼,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年倒戏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怠噪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杜跷,死狀恐怖舰绘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葱椭,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布口四,位于F島的核電站孵运,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蔓彩。R本人自食惡果不足惜治笨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一驳概、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旷赖,春花似錦顺又、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至俯萌,卻和暖如春果录,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咐熙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工弱恒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棋恼。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓返弹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親爪飘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子义起,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Awesome PHP 一個(gè)PHP資源列表,內(nèi)容包括:庫(kù)悦施、框架并扇、模板、安全抡诞、代碼分析穷蛹、日志、第三方庫(kù)昼汗、配置工具肴熏、W...
    guanguans閱讀 5,758評(píng)論 0 47
  • awesome-php 收集整理一些常用的PHP類庫(kù), 資源以及技巧. 以便在工作中迅速的查找所需... 這個(gè)列表...
    guanguans閱讀 4,427評(píng)論 0 34
  • ziadoz在 Github發(fā)起維護(hù)的一個(gè)PHP資源列表,內(nèi)容包括:庫(kù)顷窒、框架蛙吏、模板、安全鞋吉、代碼分析鸦做、日志、第三方庫(kù)...
    Gundy_閱讀 6,301評(píng)論 4 192
  • 幸福的家庭哪些地方相似谓着?青欖君想泼诱,一個(gè)幸福的家庭應(yīng)該是:媽媽被寵愛(ài),爸爸被尊重赊锚,孩子被接納治筒。
    荿涱閱讀 128評(píng)論 0 0
  • 因?yàn)閶寢屵@幾天生病了屉栓,所以我的蒜苗種晚了,媽媽先把一頭蒜拔掉蒜皮然后在一個(gè)個(gè)穿起來(lái)耸袜,拿出一個(gè)盤子放上水...
    劉嘉興閱讀 271評(píng)論 0 0