PROXY——代理模式

  代理,说白了就是中介。假设有俩对象A和B,A想访问B,但是根据迪米特法则,我们不能喝陌生人说话,简而言之就是A要减少知道B的相关情况,要降低A与B的耦合度。这时我们使用中介C,而C拥有B的相关情况,A通过C来访问B。

下面我们使用一个案例来说明代理模式:

类图:

#include<iostream>
#include<string>
using namespace std;
class Item {
public:
    Item(string kind,bool fact) {
        this->kind = kind;
        this->fact = fact;
    }
    //物品类别
    string kind;
    //是否真伪?
    bool fact;
};
/*
   抽象一种购物方式,具有买功能。
    */
class Shopping {
public:
    virtual void buy(Item &item) = 0;
};
/*
   基于抽象类,实现一种具体的购物模式,去韩国购物
    */
class KoreaShopping : public Shopping {
public:
    virtual void buy(Item &item) {
        cout<<"去韩国进行了购物,买了"<<item.kind<<endl;
    }
};
/*
   基于抽象类,实现?一种具体的购物模式,去美国购物
    */
class USAShopping : public Shopping {
public:
    virtual void buy(Item &item) {
        cout << "去美国进行了购物,买了"<< item.kind << endl;
    }
};
/*
   基于抽象类,实现一种具体的购物模式,去非洲购物
    */
class AfrikaShopping : public Shopping{
public:
    virtual void buy(Item &item) {
        cout << "去非洲进行了购物,买了" << item.kind << endl;
    }
};
/*
   有一个海外代购代理,同样实现了购物模式,
      而且增加了办理护照和货物海关安检等具体业务。
       */
class OverseasProxy :public Shopping {
public:
    OverseasProxy(Shopping* shopping) {
        this->shopMode = shopping;
    }
    ~OverseasProxy() {
        delete this->shopMode;
    }
    //调用真实购物模式  
    virtual void buy(Item &item) {
        if (distinguish(item) == true) {
            this->shopMode->buy(item);
            check(item);
        }
        else {
            cout << "发现[" << item.kind << "],不能购买" << endl;
        }
    }
    //辨别物品真伪
    bool distinguish(Item &item) {
        cout << "对物品[" << item.kind << "]辨别真伪." << endl;
        return item.fact;
    }
    //海关安检
    void check(Item &item) {
        cout << "通过海关安检,带回国内" << endl;
    }
private:
    Shopping * shopMode;
};
int main(void)
{
    //  有几种类型的物品
    Item t1("化妆品", true);
    Item t2("飞机", true);
    Item t3("狮子", false);
    Shopping *shopping = NULL;
    OverseasProxy *proxy = NULL;
    //现在想要买这几种物品
    //1.  去韩国买化妆品
    proxy = new OverseasProxy(new KoreaShopping);
    proxy->buy(t1);
    delete proxy;
    //2. 去美国买飞机
    proxy = new OverseasProxy(new USAShopping);
    proxy->buy(t2);
    delete proxy;
    //3  去非洲买狮子 
    proxy = new OverseasProxy(new AfrikaShopping);
    proxy->buy(t3);
    delete proxy;
    return 0;
}

运行结果:

时间: 2024-08-10 17:20:00

PROXY——代理模式的相关文章

php设计模式之Proxy(代理模式)和Facade(外观)设计模式

Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对它所传递的数据进行修改或检查魔术方法使得Proxy的实现变的简单,Proxy模式的一类应用时用来记录方法的访问信息还可以利用Proxy的类确定代码的范围或调试程序中存在的问题 <?php class LoggingProxy{ private $target; //传递进去一个对象 public f

Proxy - 代理模式

定义 为其他对象提供一种代理以控制对这个对象的访问. 案例 对一个对象进行访问控制的原因在于只有确实需要这个对象的时候,才会进行创建和初始化.比如一个文件编辑系统,要打开一个文件,但是文件里边除了文字,还有许多的图片.而打开文件的时候,屏幕只有那么大,不一定能完整的显示.为了提升打开文件的速度,这时候不能显示的图片就可以延迟创建,在需要显示的时候才把它创建处对象,再显示出来,这时候就需要代理模式: ImageProxy就是Image的一个代理,只有需要画Image的时候,才会去创建Image对象

设计模式12: Proxy 代理模式(结构型模式)

Proxy 代理模式(结构型模式) 直接与间接 人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活.满足特定需求的解决方案.如下图,开始时,A需要和B进行3次通信,当增加一个C后,C和B只需要通信一次,A和C通信3次就好了. 动机(Motivation) 在面向对象系统中某些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全机制,或者需要进程外的访问等),直接访问会给使用者.或者系统结构带来很多麻烦. 如果在不失去透明操作对象的同时来管理.控制这些

Java设计模式——Proxy(代理)模式

Proxy(代理)模式为对象提供一个代理或者占位来控制对该对象的访问. 图像代理 使用Proxy模式的设计有时非常脆弱,它们依赖转发方法来调用其底层对象.转发可能会建立一个非常脆弱并且需要经常维护的设计. load()方法以JFrame对象为参数,用于在指定图像加载完毕之后进行回调.在执行load()方法的时候,它先以LOADING引用的图像对象为参数调用setImage(),然后重新绘制图形显示窗口,最后为自己启动一个单独的线程.而run()方法是在单独的线程中执行的,该方法根据构造器中指定的

设计模式(十三): Proxy代理模式 -- 结构型模式

  设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供一致的接口给某个对象让它可以改变其内部功能,或者是从来不存在的功能? 可以通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象

【设计模式】Proxy 代理模式

[设计模式]Proxy 代理模式 1.代理模式的定义 代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问. 2.静态代理 首先我们通过案例来引出为什么我们需要使用代理模式. 我们给出如下一个接口Moveable 和该接口的实现类: Moveable.java package com.proxy; public interface Moveable { void move(); } Tank.java package com.proxy; import java.util.Rando

设计模式C++学习笔记之二(Proxy代理模式)

代理,一看名字就知道这只是个中介而已,真实的执行者在代理的后面呢.cbf4life在他的书里提的例子也很有趣,更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com.现在贴代码,以方便随用随取. 2.1.解释 main(),西门庆 IKindWomen,接口 CWangPo,代理 CPanJinLian,实际执行者之一 CJiaShi,实际执行者之二 说明:代理和实际执行者派生于共同的接口,代理拥有实际执行者的实例.代理的每一个函数(接口的实现函数),直接调用实际执行者的

Java 设计模式(八) Proxy(代理)模式及Spring引申

Proxy 基本概念 代理模式(Proxy pattern)是一种使用率非常高的模式: 为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫作委托模式,它是一项基本设计技巧 Proxy中的角色 Subject(抽象主题类):既可以是抽象类也可以是抽象的接口 RealSubject(具体的主题角色):是被委托角色或者说是被代理角色 Proxy(代理主题角色):是委托类或者代理类: 它负责对真实的角色的应用 把Subject定义的方法限制委托给RealSubject实现 在RealSubjec

[C++设计模式] proxy 代理模式

代理模式:为其他对象提供一种代理以控制对这个对象的访问. Proxy: 保存一个引用使得代理可以访问实体.若RealSubject和Subject的接口相同,Proxy会引用Subject,就相当于在代理类中保存一个Subject指针,该指针会指向RealSubject: 提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体: 控制对实体的存取,并可能负责创建和删除它: 其它功能依赖于代理的类型,例如: 远程代理负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求