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

使用场合:

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. JS省份联级下拉框

    <script type="text/javascript"> var china=new Object();china['北京市']=new Array('北京市区' ...

  2. 关于math头文件

    math.h是c语言里的 cmath是c++里的 fabs是对小数求绝对值 abs是对整数绝对值 用math.h里的abs对小数不能求绝对值- - fabs对小数取绝对值 abs是对整数 现在要对一个 ...

  3. 日志组件Log4Net

    <?xml version="1.0" encoding="utf-8"?> <configuration> <configSec ...

  4. 翻煎饼_简单模拟_C++

    一.题目描述(懒人可直接跳过看题目概述) 题目来源: SWUST OJ  题目0254 http://acm.swust.edu.cn/problem/0254/ 二.问题概述 给出一列数,每次可将包 ...

  5. zlib编译不过(Error A2070)解决方法(转)

    原文转自 http://dearymz.blog.163.com/blog/static/2056574200871010027435/ 1.zlib是个很牛的东东,从http://www.zlib. ...

  6. Linux内存管理图解【转】

    转自:http://www.360doc.com/content/13/0505/15/12218157_283128759.shtml Linux内存管理图解 2013-05-05  果儿的百科   ...

  7. bootstrapValidator 版本差异问题导致的submitHandler失效问题

    我用过的两个版本: v0.5.2-dev,0.4.5 这里针对于提交方法进行说明一下,如下代码: <script> $(function () { $("#addUserForm ...

  8. java的unity单元测试

    import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestUnit { publ ...

  9. Python基础-迭代器&生成器&装饰器

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 我现在有个需求,看 ...

  10. Vue v-for嵌套数据渲染问题

    Vue v-for嵌套数据渲染问题 问题描述: 由于在获取商品子分类的时候,同时需要获取子分类下的商品,那么多层的列表渲染就只能是第一层好用 问题原因: vue在处理多层的渲染的时候,不能直接用等号赋 ...