代理模式

简介

Provide a surrogate or placeholder for another object to control access to it.
为其他对象提供一种代理以控制对这个对象的访问。

代理模式(Proxy Pattern) 也称为 委托模式(Delegate),属于 结构型模式 之一。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

通俗的讲,代理模式 就是我们生活中常见的中介。

优缺点

优点

  • 协调调用者和被调用者,降低了系统的耦合度;
  • 代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用;
  • 职责清晰:真实主题角色 只负责实现实际的业务逻辑,无需关心其他非本职责的事务,通过后期代理的访问控制,可以扩展或缩减实际事务,符合设计模式 单一职责原则,代码简洁清晰;
  • 高扩展性:真实主题角色 负责实际业务逻辑,可能经常性变动,但是由于其与 代理类 都实现了 抽象主题,因此,真实主题 的改变不会影响到代理类,符合设计模式 依赖倒置原则里氏替换原则开闭原则
  • 智能化:主要是基于动态代理的实现,可以在程序运行时生成一个合适的代理类;

缺点

  • 由于在客户端和 真实主题 之间增加了 代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢;
  • 实现代理模式需要额外的工作(有些代理模式的实现非常复杂),从而增加了系统实现的复杂度;

使用场景

  • 当无法或不想直接引用某个对象或访问某个对象存在困难时,可以通过也给代理对象来间接访问;

模式讲解

首先看下 代理模式 的通用 UML 类图:

代理模式

代理模式 一般包含三种角色:

  • 抽象主题角色(Subject)抽象主题类 的主要职责是声明 真实主题代理 的共同接口方法,该类可以是接口也可以是抽象类;
  • 真实主题角色(RealSubject):该类也被称为 被委托类被代理类,该类定义了代理所表示的真实对象,是负责执行系统真正的逻辑业务对象;
  • 代理主题角色(Proxy):也被称为 委托类代理类,其内部持有 RealSubject 的引用,因此具备完全的对 RealSubject 的代理权;

下面是 代理模式 的通用代码展示:

   class Client {

    public static void main(String[] args) {
        ISubject realSubject = new RealSubject();
        ISubject proxy = new Proxy(realSubject);
        proxy.request();
    }

    // 抽象主题 Subject
    public interface ISubject {
        void request();
    }

    // 真实主题 RealSubject
    public static class RealSubject implements ISubject {

        @Override
        public void request() {
            System.out.println("I'm RealSubject.");
        }
    }

    // 代理类 Proxy
    public static class Proxy implements ISubject {
        private ISubject mRealSubject;

        public Proxy(ISubject subject) {
            this.mRealSubject = subject;
        }

        @Override
        public void request() {
            this.doProxy();
            this.mRealSubject.request();
        }

        private void doProxy() {
            System.out.println("代理转发");
        }
    }
}

代理模式的设计中谨记:代理类(Proxy)真实主题(RealSubject) 都要实现 抽象主题(Subject)接口,这样两者的行为才会一致,并且能够允许多重代理的实现。

注意:代理模式 的 UML 类图和通用代码实现上看,代理模式装饰模式 几乎一模一样。代理模式Subject 对应 装饰模式Component代理模式RealSubject 对应 装饰模式ConcreteComponent代理模式Proxy 对应 装饰模式Decorator。确实, 从代码实现上看,代理模式 的确与 装饰模式 是一样的(其实 装饰模式 就是 代理模式 的一个特殊应用),但是这两种设计模式所面向的功能扩展面是不一样的:

  • 装饰模式 强调 自身功能的扩展Decorator 所做的就是增强 ConcreteComponent 的功能(也有可能减弱功能),主体对象为 ConcreteComponent,着重类功能的变化;
  • 代理模式 强调 对代理过程的控制Proxy 完全掌握对 RealSubject 的访问控制,因此,Proxy 可以决定对 RealSubject 进行功能扩展,功能缩减甚至功能散失(不调用 RealSubject 方法),主体对象为 Proxy

简单来讲,假设现在小明想租房,那么势必会有一些事务发生:房源搜索,联系房东谈价格····
假设我们按照 代理模式 进行思考,那么小明只需找到一个房产中介,让他去干房源搜索,联系房东谈价格这些事情,小明只需等待通知然后付点中介费就行了;
而如果采用 装饰模式 进行思考,因为 装饰模式 强调的是 自身功能扩展,也就是说,如果要找房子,小明自身就要增加房源搜索能力扩展,联系房东谈价格能力扩展,通过相应的装饰器,提升自身能力,一个人做满所有的事情。

代理模式 按照代理创建的时期来进行分类的话, 可以分为两种:静态代理、动态代理。具体内容可查看:Java代理模式

总结:代理模式 应用非常广泛,大到一个系统框架,企业平台,小到代码片段,事务处理,都很有可能用到 代理模式。甚至在其他形式的结构型设计模式中,我们都可以看到 代理模式 的影子,有些模式虽然作为单独的一种设计模式,但倒不如说是 代理模式 的一种针对性优化。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容