设计模式之四:代理模式(Proxy)

代理模式:

为某个类提供了一个代理来控制访问它。

Provide a surrogate or placeholder for another object to control access to it.

UML图:

主要包括:

  1. Subject(IMath):姑且称之为抽象的主题角色吧,这个类为代理类(Proxy)和真实的主题角色(RealSubject)定义了一个统一的接口,这样代理类(Proxy)可以出现在真实的主题角色(RealSubject)出现的任何地方。
  2. RealSubject(Math):定义了一个代理类(Proxy)将要表示的真实的主题角色。
  3. Proxy(MathProxy):代理类,这个类包含了一个对RealSubject的引用;它提供了一个和Subject同样的接口这样Proxy就能替换RealSubject;控制访问RealSubject并且负责创建和删除RealSubject。

根据UML图编写的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

class Subject
{
        public:
                virtual void request()=0;
};

class RealSubject:public Subject
{
        public:
                void request()
                {
                    std::cout<<"RealSubject::request()"<<std::endl;
                }

};

class Proxy:public Subject
{
        public:
                void request()
                {
                        //使用延迟初始化的技术
                        if(realSubject==NULL)
                                realSubject=new RealSubject();

                        realSubject->request();
                }
    private:
            RealSubject * realSubject;

};

int main()
{
    std::cout<<"代理模式测试:"<<std::endl;
    Proxy * proxy=new Proxy();
    proxy->request();

    delete proxy;
    return 0;
}

输出:

然后是一个真实的例子,使用代理模式实现加减乘除运算:

#include <stdlib.h>
#include <stdio.h>
#include <iostream>

/**一个真实的代理模式的例子
 * Proxy为MathProxy,客户端可见的是这个代理类的对象
 * Subject为IMath,这个是代码类和真实的主题必须遵循的接口
 * RealSubject为Math,真正完成工作的类是这个类
 */
class IMath
{
    public:
            virtual double add(double lhs,double rhs)=0;
            virtual double sub(double lhs,double rhs)=0;
            virtual double div(double lhs,double rhs)=0;
            virtual double mul(double lhs,double rhs)=0;

};

class Math:public IMath
{
    public:
            double add(double lhs,double rhs)
            {
                return lhs+rhs;
            }
            double sub(double lhs,double rhs)
            {
                return lhs-rhs;
            }
            double div(double lhs,double rhs)
            {
                return lhs/rhs;
            }
            double mul(double lhs,double rhs)
            {
                return lhs*rhs;
            }

};

class MathProxy:public IMath
{
    public:
            MathProxy()
            {
                math=new Math();
            }
            ~MathProxy()
            {
                if(math!=NULL)
                {
                    delete math;
                    math=NULL;
                }
            }
            double add(double lhs,double rhs)
            {
                return math->add(lhs,rhs);
            }
            double sub(double lhs,double rhs)
            {
                return math->sub(lhs,rhs);
            }
            double div(double lhs,double rhs)
            {
                return math->div(lhs,rhs);
            }
            double mul(double lhs,double rhs)
            {
                return math->mul(lhs,rhs);
            }

    private:
            Math * math;

};

int main()
{
    std::cout<<"真实的代理模式的例子"<<std::endl;
    MathProxy* proxy=new MathProxy();
    std::cout<<"lhs:1 rhs:2"<<std::endl;
    std::cout<<"proxy->add:"<<proxy->add(1,2)<<std::endl;
    std::cout<<"proxy->sub:"<<proxy->sub(1,2)<<std::endl;
    std::cout<<"proxy->div:"<<proxy->div(1,2)<<std::endl;
    std::cout<<"proxy->mul:"<<proxy->mul(1,2)<<std::endl;
    return 0;
}

输出:

时间: 2024-10-09 19:44:53

设计模式之四:代理模式(Proxy)的相关文章

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

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

设计模式三: 代理模式(Proxy) -- JDK的实现方式

设计模式三: 代理模式(Proxy) -- JDK的实现方式 简介 代理模式属于行为型模式的一种, 控制对其他对象的访问, 起到中介作用. 代理模式核心角色: 真实角色,代理角色; 按实现方式不同分为静态代理和动态代理两种; 意图 控制对其它对象的访问. 类图 实现 JDK自带了Proxy的实现, 下面我们先使用JDK的API来演示代理如何使用, 随后再探究Proxy的实现原理,并自己来实现Proxy. JDK代理类的使用: (InvocationHandler,Proxy) 使用JDK实现的代

Android设计模式之代理模式 Proxy

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

设计模式之代理模式---Proxy Pattern

模式的定义 代理模式(Proxy Pattern)也叫做委托模式,定义如下: Provide a surrogate or placeholder for another object to control access to is. 为其他对象提供一种代理以控制对这个对象的访问. 类型 结构类 模式的使用场景 想想现实世界中,打官司为什么要找个律师?因为你不想参与中间过程的是是非非,只要完成自己的工作就可以,其它的事情比如事前调查,事后追查都可以由律师来负责,这就可以减少你的负担.代理模式使用

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

一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一种模式,而且变种较多(虚代理.远程代理.copy-on-write代理.保护代理.Cache代理.防火墙代理.同步代理.智能指引),应用场合覆盖从小结构到整个系统的大结构, 我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理. 代理对象角色内部含有对真实对象的

二十三种设计模式[12] - 代理模式(Proxy Pattern)

前言 代理模式,属于对象结构型模式.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 为其它对象提供一种代理以控制对这个对象的访问 ". 在代理模式中,通常使用一个类来代表另一个类的功能,并由这个代理对象去控制原对象的引用. 结构 Subjuet(公共接口):代理类和被代理类的公共接口,保证任何使用目标的地方都可以被代理类替换: RealSubject(被代理类):代理类所代表的目标类: Proxy(代理类):包含对目标类的引用,目标类的封装: 场景 在日常生活中

设计模式 笔记 代理模式 Proxy

//---------------------------15/04/21---------------------------- //Proxy 代理模式-----对象结构型模式 /* 1:意图: 为其他对象提供一种代理以控制对这个对象的访问. 2:别名: Surrogate 3:动机: 4:适用性: 1>远程代理: 为一个对象在不同的地址空间提供局部代表. 2>虚代理: 根据需要创建开销很大的对象. 3>保护代理: 控制对原始对象的访问.保护代理用于对象应该有不同的访问权限的时候.

设计模式之四 代理模式

代理模式是一个使用率非常高的模式,其定义如下: 为其他对象提供一种代理可以控制对这个对象的访问. Subject 抽象主题角色 抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求 RealSubject 具体主题角色 被委托的角色,被代理的角色. 它才是冤大头,是业务逻辑的具体执行者. Proxy 代理主题角色 也叫委托类,代理类. 它负责对真是角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作.

Java学习笔记——设计模式之四.代理模式

To be, or not to be: that is the question. --<哈姆雷特> 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 上代码: 1 package cn.no4.proxy; 2 3 public interface IMakeMoney { 4 5 void makeMoney(); 6 } 1 package cn.no4.proxy; 2 3 public class Proxy implements IMakeMoney { 4

【设计模式】—— 代理模式Proxy

前言:[模式总览]——————————by xingoo 模式意图 代理模式为其他的对象增加一个代理对象,进行访问控制.从而避免直接访问一个对象,造成效率或者安全性上的降低. 应用场景 1 远程代理,为一个远程对象,创建一个本地的代理对象.每次访问,直接访问本地代理对象即可. 2 虚代理,如果对象很大,直接访问开销很大,可以为他创建一个代理对象,只生成关键的信息即可. 3 保护代理,为某个对象增加一种保护机制,只有一定的权限才能通过这个代理,访问后面的对象. 4 智能指针,有点像C++里面的那个