为其他对象提供一种代理以控制对这个对象的访问.

使用场合:

1.远程代理:为一个对象在不同的地址空间提供局部代表,隐藏对象存在于不同地址空间的事实.
2.虚拟代理:根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象.
3.安全代理:用来控制真实对象访问时的权限.
4.智能指引:当调用真实对象时,代理处理另外一些事.

UML:

示例代码:

interface AbstractSubject
{
public function connect();
} class RealSubject implements AbstractSubject
{
public function connect()
{
echo 'link to db';
}
} class ProxySubject implements AbstractSubject
{
protected $real; public function __construct()
{
if (is_null($this->real)) {
$this->real = new RealSubject();
}
} public function connect()
{
$this->real->connect();
}
} $proxy = new ProxySubject();
$proxy->connect();

  

示例代码:

abstract class MySQL
{
protected $link; protected function __construct()
{
$this->connect();
} public function getAll($table)
{
echo get_called_class() . PHP_EOL;
$res = $this->link->query("SELECT * FROM {$table}");
$data = array(); foreach ($res as $row) {
$data[] = $row;
}
return $data;
} public function close()
{
$this->link = null;
} abstract public static function getInstance();
} class ReadMySQL extends MySQL
{
protected static $instance; public static function getInstance()
{
if (is_null(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
} public function connect()
{
if (is_null($this->link)) {
$this->link = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root');
}
}
} class WriteMySQL extends MySQL
{
protected static $instance; public static function getInstance()
{
if (is_null(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
} public function connect()
{
if (is_null($this->link)) {
$this->link = new PDO('mysql:host=192.168.2.10;dbname=test', 'root', 'root');
}
}
} class ProxyMysql
{
private $reader;
private $writer; public function __construct()
{
$this->reader = ReadMySQL::getInstance();
$this->writer = WriteMySQL::getInstance();
} public function getAll($table)
{
if (rand(1,2) === 1) {
return $this->reader->getAll($table);
} else {
return $this->writer->getAll($table);
}
}
} $test = new ProxyMysql();
var_dump($test->getAll('test'));
var_dump($test->getAll('test'));
var_dump($test->getAll('test'));
var_dump($test->getAll('test'));

  

我们用ProxyMysql代理了ReaderMysql和WriterMysql,简单的随机判断从两台服务器读取数据.

S3:代理模式 Proxy的更多相关文章

  1. 代理模式/proxy模式/结构型模式

    代理模式proxy 定义 为其他对象提供一种代理,并以控制对这个对象的访问.最简单的理解,买东西都是要去商店的,不会去工厂. java实现三要素 proxy(代理)+subject(接口)+realS ...

  2. 代理模式(Proxy pattern)

    代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...

  3. 13.代理模式(Proxy Pattern)

    using System; namespace Test { //抽象角色:声明真实对象和代理对象的共同接口. //代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象, //同时代理 ...

  4. 大熊君说说JS与设计模式之------代理模式Proxy

    一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...

  5. 【转】设计模式(十一)代理模式Proxy(结构型)

    设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ...

  6. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  7. 代理模式 PROXY Surrogate 结构型 设计模式(十四)

    代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...

  8. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...

  9. 设计模式——代理模式(Proxy Pattern)

    代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...

随机推荐

  1. hdu 4679 树的直径

    /* 题目大意:给n个点n-1条边的树,求删除哪条边时两个树中最大的直径与边权的乘积最小. 树的直径(Diameter)是指树上的最长简单路. 直径的求法:两遍BFS (or DFS) 若删除的边不是 ...

  2. gvim设置使用

    最近有一款编辑器叫sublimeText 2比较流行,我也下载用了一下,确实很好看,自动完成,缩进功能什么的也比较齐全,插件也十分丰富.但用起来不是很顺手,最后还是回到了Gvim(Vim的GUI版本, ...

  3. SQLSever 触发器

    /*DML触发器分为: 1. after触发器(之后触发) a. insert触发器 b. update触发器 c. delete触发器*/ /*UPDATE 触发器创建触发的语法*/ CREATE ...

  4. C#的泛型委托Predicate/Func/Action

    Predicate<T> 是一个委托,它代表了一个方法,它的定义是: namespace System {    // 摘要:    表示定义一组条件并确定指定对象是否符合这些条件的方法. ...

  5. COMPANY_点取消会卡死的解决方法

    // OLD void ctonedlg::onbtn_basedir_clicked() {     m_basedir = getUserSelectDir();     doSearchDir( ...

  6. J.U.C并发框架源码阅读(七)CyclicBarrier

    基于版本jdk1.7.0_80 java.util.concurrent.CyclicBarrier 代码如下 /* * ORACLE PROPRIETARY/CONFIDENTIAL. Use is ...

  7. 51nod 1101 换零钱 【完全背包变形/无限件可取】

    1101 换零钱  基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 ...

  8. #424 Div2 C

    #424 Div2 C 题意 给出 k 个分数,初始分数未知,按顺序把这 k 个分数加到初始分数上,已知 n 个加入分数后的结果(无序),问初始分数有多少种可能. 分析 也就是说这 n 个结果,它们之 ...

  9. 洛谷——P1100 高低位交换

    P1100 高低位交换 题目描述 给出一个小于2^32的正整数.这个数可以用一个32位的二进制数表示(不足32位用0补足).我们称这个二进制数的前16位为“高位”,后16位为“低位”.将它的高低位交换 ...

  10. Big5

    在以下各表中定义了 Big5 语言环境的代码范围: 平面 代码范围 描述 1 A140H - A3E0H 符号和中文控制代码 1 A440H - C67EH 常用字符 2 C940H - F9D5H ...