首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >php设计模式(十四):代理模式(Proxy)

php设计模式(十四):代理模式(Proxy)

作者头像
陈大剩博客
发布于 2023-05-10 01:25:19
发布于 2023-05-10 01:25:19
42700
代码可运行
举报
运行总次数:0
代码可运行

代理模式

代理模式又称 Proxy,代理是一种结构型设计模式,能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。

问题

代理在我们生活中无处不在,比如说:我们超时买的怡宝矿泉水,都零售商从地区代理商那批发来的,我们程序员也经常为了翻过一堵墙用谷歌查找资料使用代理等。

如果有这样一个消耗大量系统资源的巨型对象,我们是偶尔需要使用它,并非总是需要。

我们可以实现延迟初始化——在实际有需要时再创建该对象。对象的所有客户端都要执行延迟初始代码。不好的是,这很可能会带来很多重复代码。

在理想情况下,我们希望将代码直接放入对象的类中,但这并非总是能实现:比如类可能是第三方封闭库的一部分。

解决方法

我们可以新建一个与原服务对象接口相同的代理类,然后更新应用以将代理对象传递给所有原始对象客户端。代理类接收到客户端请求后会创建实际的服务对象,并将所有工作委派给它。

代理将自己伪装成数据库对象,可在客户端或实际数据库对象不知情的情况下处理延迟初始化和缓存查询结果的工作。

这样如果需要在类的主要业务逻辑前后执行一些工作,无需修改类就能完成这项工作。由于代理实现的接口与原类相同,因此可将其传递给任何一个使用实际服务对象的客户端。

结构

DbInterface:数据库接口;定义真实主题和代理的公共方法; Db:实现数据库接口的数据库;隐藏在代理之后; Proxy:实现数据库接口并在内部引用了真实的数据库;

代码示例

数据库接口类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 数据库接口
 * Interface DbInterface
 * @package cxbdasheng\DesignPatterns\Proxy
 */
interface DbInterface
{
    /**
     * 获取数据
     * @return mixed
     */
    public function get();

    /**
     * 设置数据
     * @return mixed
     */
    public function set();

    /**
     * 删除数据
     * @return mixed
     */
    public function delete();

}

真实数据库类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 真实数据库类
 * Class Db
 * @package cxbdasheng\DesignPatterns\Proxy
 */
class Db implements DbInterface
{
    public function get()
    {
        return '真实数据库获取数据方法';
    }

    public function set()
    {
        return '真实数据库设置数据方法';
    }

    public function delete()
    {
        return '真实数据库删除数据方法';
    }

}

代理类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 代理
 * Class Proxy
 * @package cxbdasheng\DesignPatterns\Proxy
 */
class Proxy implements DbInterface
{
    private $db = null;

    /**
     * 构造函数
     * Proxy constructor.
     */
    public function __construct()
    {
        if ($this->db == null) {
            $this->db = new Db();
        }
        return $this->db;
    }

    public function get()
    {
        // todo 做我代理想做的事
        return $this->db->get();
    }

    public function set()
    {
        return $this->db->set();
    }

    public function delete()
    {
        return $this->db->delete();
    }

}

客户端使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$db = new Proxy();

// 获取数据
echo $db->get() . PHP_EOL;
// 设置数据
echo $db->set() . PHP_EOL;
//删除数据
echo $db->delete() . PHP_EOL;

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
真实数据库获取数据方法
真实数据库设置数据方法
真实数据库删除数据方法

UML

优缺点

优点

  • 可以在客户端毫无察觉的情况下控制服务对象。
  • 如果客户端对服务对象的生命周期没有特殊要求,可以对生命周期进行管理。
  • 即使服务对象还未准备好或不存在,代理也可以正常工作。
  • 开闭原则。你可以在不对服务或客户端做出修改的情况下创建新代理。

缺点

  • 代码可能会变得复杂,因为需要新建许多类。
  • 服务响应可能会延迟。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​PHP设计模式之建造者模式
建造者模式,也可以叫做生成器模式,builder这个词的原意就包含了建筑者、开发者、创建者的含义。很明显,这个模式又是一个创建型的模式,用来创建对象。那么它的特点是什么呢?从建筑上来说,盖房子不是一下子就马上能把一个房子盖好的,而是通过一砖一瓦搭建出来的。一个房子不仅有砖瓦,还有各种管道,各种电线等等,由它们各个不部分共同组成了一栋房子。可以说,建造者模式就是这样非常形象的由各种部件来组成一个对象(房子)的过程。
硬核项目经理
2019/10/17
5400
php设计模式(二十一):备忘录模式(Memento)
备忘录模式又称为快照、Snapshot、Memento,备忘录模式是一种行为设计模式,允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。
陈大剩博客
2023/05/24
2910
php设计模式(二十一):备忘录模式(Memento)
PHP设计模式之门面模式
门面模式,也叫外观模式。不管是门面还是外观,都是我们对外的媒介,就好像我们的脸面一样。所以,这个模式最大的特点就是要表现的“好看”。怎么说呢?一堆复杂的对象调用,自己都看蒙了,特别是对老系统进行升级维护的时候。用门面来把老系统的功能调用封装起来,在外面看来就和新系统一样,这就是门面模式的用途啦!
硬核项目经理
2019/10/24
6840
PHP设计模式之代理模式
代理人这个职业在中国有另外一个称呼,房产经济人、保险经济人,其实这个职业在国外都是叫做房产代理或者保险代理。顾名思义,就是由他们来帮我们处理这些对我们大部分人来说都比较生疏的专业领域的工作。代理模式也是一样的道理,同时,在这篇文章中还会简单的介绍正向代理和反向代理是怎么回事。
硬核项目经理
2019/09/25
4560
PHP设计模式之代理模式
PHP设计模式之迭代器模式
一说到这个模式,就不得不提循环语句。在《大话设计模式》中,作者说道这个模式现在的学习意义更大于实际意义,这是为什么呢?当然就是被foreach这货给整得。任何语言都有这种类似的语法可以方便快捷的对数组、对象进行遍历,从而让迭代器模式从高高在上的23大设计模式中的明星慢慢成为了路人。特别是我们这门PHP语言,PHP的强大之处就在于对于数组的灵活操作,本身就是hashmap的结构,自然会有各种方便的数组操作语法,而foreach也是我们最常用的语句,甚至比for还常用。
硬核项目经理
2019/08/23
5400
PHP设计模式之迭代器模式
PHP设计模式之访问者模式
访问者,就像我们去别人家访问,或者别人来我们家看望我们一样。我们每个人都像是一个实体,而来访的人都会一一的和我们打招呼。毕竟,我们中华民族是非常讲究礼数和好客的民族。访问者是GoF23个设计模式中最复杂的一个模式,也是各类设计模式教材都放在最后的一个模式。先不管难度如何,我们先看看它的定义和实现。
硬核项目经理
2019/11/10
4910
PHP设计模式之状态模式
状态模式从字面上其实并不是很好理解。这里的状态是什么意思呢?保存状态?那不就是备忘录模式了。其实,这里的状态是类的状态,通过改变类的某个状态,让这个类感觉像是换了一个类一样。说起来有点拗口吧,先学习概念之后再看。
硬核项目经理
2019/11/10
6130
php设计模式(十三):享元模式(Flyweight)
享元模式又称:缓存、Cache、Flyweight,享元是一种结构型设计模式,它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。
陈大剩博客
2023/05/07
2910
php设计模式(十三):享元模式(Flyweight)
PHP设计模式之责任链模式
GoF定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
硬核项目经理
2019/09/18
5560
PHP设计模式之责任链模式
PHP设计模式之享元模式
享元模式,“享元”这两个字在中文里其实并没有什么特殊的意思,所以我们要把它拆分来看。“享”就是共享,“元”就是元素,这样一来似乎就很容易理解了,共享某些元素嘛。
硬核项目经理
2019/10/08
5400
PHP设计模式之享元模式
设计模式(十一)代理模式Proxy(结构型)
代理模式在很多情况下都非常有用,特别是你想强行控制一个对象的时候,比如:延迟加载,监视状态变更的方法等等
黄规速
2022/04/14
3750
设计模式(十一)代理模式Proxy(结构型)
PHP设计模式之备忘录模式
备忘录,这个名字其实就已经很形象的解释了它的作用。典型的例子就是我们原来玩硬盘游戏时的存档功能。当你对即将面对的大BOSS有所顾虑时,一般都会先保存一次进度存档。如果挑战失败了,直接读取存档就可以恢复到挑战BOSS前的状态,然后你就开开心心的再去练一会级回来解决这个大BOSS就好了。不过,为了以防万一,在挑战BOSS之前存个档总是好的。另外一个例子就是我们码农们天天要用到的代码管理工具Git或者Svn了。每次的提交都像是一次存档备份,当新代码出现问题的时候,直接回滚恢复就行了。这些,都是备忘录模式的典型应用,下面就一起来看看这个模式吧。
硬核项目经理
2019/10/17
5580
php设计模式(十):组合模式(Composite)
组合模式又称:对象树、Object Tree、Composite,组合 是一种结构型设计模式,使用它将对组合成树状结构,并且能像使用独立对象一样使用它们。
陈大剩博客
2023/04/27
4470
php设计模式(十):组合模式(Composite)
php设计模式(十七):迭代器模式(Iterator)
迭代器模式又称为:Iterator。迭代器是一种行为设计模式,能在不暴露集合底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。迭代器模式允许用户通过特定的顺序访问容器中的数据,它将数据和顺序的实现分离,很少有有人直接去用迭代器的了,因为一般语言已经帮实现了如:foreach…,所以单独使用的常见很少了。
陈大剩博客
2023/05/13
5490
php设计模式(十七):迭代器模式(Iterator)
设计模式专题(四)——代理模式
设计模式专题(四)——代理模式 (原创内容,转载请注明来源,谢谢) 一、概述 代理模式(Proxy)是为其他对象提供一种代理,以控制这个对象的访问。即外系统需要调用系统内部的服务,都要通过代理。这个模式在RPC架构中非常常用。 1)使用场景 代理模式在项目中使用广泛。 1.远程代理。即将proxy文件放置于公共部分,作为真正提供接口的地方,而实际实现接口不在此文件中。这样实现远程访问的功能。 2.虚拟代理。如果需要创建一个开销很大的对象,可以用代理模式,用它来存放实
用户1327360
2018/03/07
8100
设计模式专题(四)——代理模式
PHP设计模式之单例模式
单例模式绝对是在常用以及面试常问设计模式中排名首位的。一方面它够简单,三言两语就能说明白。另一方面,它又够复杂,它的实现不仅仅只有一种形式,而且在Java等异步语言中还要考虑多线程加锁的问题。所以在面试时,千万不要以为面试官出单例模式的问题就放松了,这个模式真的是可深可浅,也极其能体现一个开发者的水平。因为只要工作过一段时间,不可避免的就会接触到这个模式。
硬核项目经理
2019/11/02
1.2K0
php设计模式(九):桥接模式(Bridge)
又称:Bridge。桥接是一种结构型设计模式,可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。
陈大剩博客
2023/04/27
3590
php设计模式(九):桥接模式(Bridge)
php设计模式(十六):命令模式(Command)
命令模式又称为:动作、事务、Action、Transaction、Command。命令是一种行为设计模式,可将请求转换为一个包含与请求相关的所有信息的独立对象。该转换让你能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。
陈大剩博客
2023/05/12
2970
php设计模式(十六):命令模式(Command)
PHP设计模式之组合模式
互联网公司流行扁平化管理,也就是管理层级尽量少于或者不超过三层,作为一个底层的码农,你的CEO和你的职级也就相差3层以内。但是很多传统企业,则会有非常深的层级关系,从数据结构看,这种按职能进行分组的组织架构非常像一颗树。而我们今天介绍的组合模式的作用就和这个企业组织架构层级的模式非常类似。
硬核项目经理
2019/10/08
7320
PHP设计模式之组合模式
php设计模式(二十):状态模式(State)
状态模式又称为:State。状态是一种行为设计模式,能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。
高老师
2023/09/18
3020
php设计模式(二十):状态模式(State)
相关推荐
​PHP设计模式之建造者模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档