设计模式 之 代理

代理模式(Proxy)

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

炎炎夏日即将过去,这个夏天的西瓜,你吃爽了吗?如果要问夏天有什么可留恋的?那么肯定是那冰冰凉凉的冰西瓜!炎热的夏季里,抱着半个从冰箱里刚拿出来的冰镇西瓜,用勺子挖着吃,是很多人觉得最惬意的吃法。相信大家也都这么干过...

今天跟大家聊的不是怎么吃西瓜,而是在哪里买西瓜。相信大家都见过路边的小摊小贩拖着一卡车西瓜便宜甩卖的场景吧;大家一般也可以在超市里买西瓜,但是这些西瓜是从哪里来的呢?小贩种的?超市种的?当然不是,大家接着往下看就明白了...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Proxy
{
    //西瓜接口
    public interface IWatermelon
    {
        //生产西瓜的方法
         void product();
        //销售西瓜的方法
         void sell();
    }

    //西瓜生产工厂
    public class WatermelonFactory :IWatermelon
    {
        public void product()
        {
            Console.WriteLine("农民伯伯在地里种出西瓜...");
        }

        public void sell()
        {
            Console.WriteLine("农民伯伯销售西瓜...");
        }
    }

    //西瓜代理商
    public class WatermelonProxy :IWatermelon
    {
        //从农民伯伯手里收购西瓜
        private IWatermelon watermelon;

        public WatermelonProxy (IWatermelon watermelon)
        {
            this.watermelon = watermelon;
        }

        public void product()
        {
            this.watermelon .product ();
            Console.WriteLine("代理商从农民伯伯手里收购西瓜...");
        }

        public void sell()
        {
            Console.WriteLine("代理商从农民手里低价收购西瓜,然后以较高的价格销售,从中赚取一定的差价...");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //创建西瓜生产工厂
            IWatermelon watermelonFactory = new WatermelonFactory();
            //获得代理对象实例
            IWatermelon watermelonProxy = new WatermelonProxy(watermelonFactory );
            //代理商生产西瓜(其实是农民伯伯种出西瓜)
            watermelonProxy.product();
            //代理商销售西瓜(低价收购西瓜,然后以较高价格出售,赚取差额利润)
            watermelonProxy.sell();

        }
    }
}

类图

代理模式包含如下三个角色:

        Subject(抽象角色):声明真实主题和代理主题的共同接口

        RealSubject(真实角色):真正处理请求的目标对象,客户端可以通过代理角色间接调用真实主题角色中定义的操作。

        Proxy(代理角色):代理对象角色内部含有真是对象的引用,从而代理对象可以将请求转为真实对象处理。 同时,代理对象在执行真实对象操作的前后还可以添加附加操作。

主要优点:

1.能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

2.客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。

主要缺点:

1.由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,

2.实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂。

使用场合:

1.远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代理。

2.虚拟代理(VirtualProxy)若一个对象的创建非常耗时,可通过代理对象去调用,在真实对象创建前,返回一个假的调用,等真实对象创建好了,这时返回给客户端的就是一个真实对象的响应方法调用。

3.保护代理(ProtectionProxy)控制对原始对象的访问。

4.智能指引(SmartReference)取代了简单的指针,它在访问对象时执行一些附加操作。

相关模式:

装饰者:装饰者重点在与添加附加行为修饰被装饰者。

代理:代理的重点是代替本人作业,减少对实际对象的操作。

时间: 2024-10-10 16:23:34

设计模式 之 代理的相关文章

Android设计模式之代理模式 Proxy

一.概述 代理模式也是平时比较常用的设计模式之一,代理模式其实就是提供了一个新的对象,实现了对真实对象的操作,或成为真实对象的替身.在日常生活中也是很常见的.例如A要租房,为了省麻烦A会去找中介,中介会替代A去筛选房子,A坐享中介筛选的结果,并且交房租也是交给中介,这就是一个典型的日常生活中代理模式的应用.平时打开网页,最先开到的一般都是文字,而图片等一些大的资源都会延迟加载,这里也是使用了代理模式. 代理模式的组成: Abstract Subject:抽象主题-声明真实主题和代理主题共同的接口

【设计模式】代理模式

代理模式在所需对象和用户代码之间增加了一层对象,这个对象被称为代理.用户代码只需要直接操作代理对象即可.著名的代理模式的例子就是引用计数指针对象,它使得我们对真实对象的操作都需要经过引用计数指针对象.下面是用C++写的一个运用了代理模式的例子. #include <iostream> #include <string> using namespace std; // 作为接口的抽象基类 class Subject { public: virtual void DoAction()

设计模式之代理模式(Proxy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

【大话设计模式】——代理模式

对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持三种继承映射策略: 使用 subclass 进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态. 使用 joined-subclass 进行映射: 对于继承关系中的子类使用同一个表

设计模式之代理模式 c++实现以及详解

proxy模式 <1> 作用: 为其他对象提供一种代理以控制对这个对象的访问. <2> 代理模式的应用场景: 如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法: 1.修改原有的方法来适应.这样违反了"对扩展开放,对修改关闭"的原则. 2.就是采用一个代理类调用原有的方法,且对产生的结果进行控制.这种方法就是代理模式. 使用代理模式,可以将功能划分的更加清晰,有助于后期维护! <3> 结构图 代理类,含有一个指向RealSubject

JAVA设计模式之代理模式

学编程吧JAVA设计模式之代理模式发布了,欢迎通过xuebiancheng8.com来访问 一.概述 给某一个对象提供一个代理,并由代理对象来完成对原对象的访问.代理模式是一种对象结构型模式. 二.适用场景 当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口. 三.UML类图 四.参与者 1.接口类:Subject 它声明了真实访问者和代理访问者的共同接口,客户端通常需要针对接口角色进行编程. 2.代理类

JAVA设计模式(3)----代理模式

1.  什么是代理模式?Proxy Pattern 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 通俗的讲,代理模式就是我很忙没空理你,你要想找我可以先找我的代理人,代理人和被代理人继承同一个接口.代理人虽然不能干活,但是被代理的人可以干活. 这个例子中有水浒传中的这么几个人:名垂青史的潘金莲,王婆,西门大官人.西门庆想要找潘金莲,需要找王婆做代理.首先定义一个接口:Kin

设计模式--动态代理(CGLIB)

上一篇文章<设计模式--动态代理(JDK)>已经写了JDK中动态代理的应用,这篇文章将介绍动态代理在CGLIB中应用.,从上篇文章中我们知道使用JDK动态代理是有一定限制.就是被代理类必须至少实现一个接口,因为JDK为我们生成的动态代理也是实现这个接口的.所以如果没有接口,JDK基本就歇菜了.CGLIB正好弥补了JDK的这个缺陷,他的被代理类是无需实现接口,因为它的实现机制是继承被代理类,从而创建一个代理对象(继承被代理对象)的. CGLIB(Code Generation Library)是

设计模式之代理模式20170724

结构型设计模式之代理模式: 一.含义 代理模式也叫做委托模式,其定义如下: 为其他对象提供一种代理以控制对这个对象的访问. 二.代码说明 1.主要有两个角色 1)具体主题角色 也叫做委托角色.被代理角色.它是业务逻辑的具体执行者. 2)代理主题角色 也叫做委托类.代理类.它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作. 一个代理类可以代理多个被委托者或被代理者. 2.在用C实现过程中也是参考这种思想,以游戏代理场

常用设计模式之代理(动态代理)

常用设计模式之代理(动态代理) UML Code1 1 interface Subject{void doSth();} 2 class RealSubject implements Subject{ 3 public void doSth(){ 4 System.out.println("RealSubject doSth...."); 5 } 6 } 7 class ProxyHandler implements InvocationHandler 8 { 9 private Ob