美文网首页程序员
设计模式之代理模式

设计模式之代理模式

作者: 北风一叶 | 来源:发表于2016-01-30 11:37 被阅读113次

本章是对设计模式之禅一书中代理模式一章的总结与整理。

1.定义

为其它对象提供一种代理以控制对这个对象的访问。不好理解,设计模式的每种类型的定义第一遍都不太好读懂的,这句话翻译成大白话就是:你要想访问我,对不起,找我代理吧。用另外的话说就是:你要访问一个对象,对不起,通过它的代理去访问它吧,人家不想和你直接打交道。最简单的实例就是:你要去拜访一个明星,是不是得先去找人家的经纪人呢。代理就是这么个意思,这是根本,这个是宗旨。通用类图如下:


代理模式类图.png

2.扩展与类型

第一类:普通代理

书中将普通代理分为了两个大类,一个是透明代理,一个是普通代理。

  1. 透明代理:就是用户不用设置代理,可以直接访问真实的(比如代理服务器)

  2. 普通代理:要求是客户只能访问代理角色,而不能访问真实的角色,这个是最好理解的。一个真实的示例就是:懒人买余额宝,由余额宝去买基金,余额宝就是代理角色,而你实际买的应该是一些基金,只不过是通过余额宝购买的。

第二类:强制代理

这个比较变态,你根本不知道代理是谁,只知道真实角色是谁,你必须通过真实的对象获取它的代理类,然后通过代理类去访问真实角色,如果不是真实角色给你的代理你也无法访问,挺变态的。

示例是这样的:你的一个朋友现在是一名很牛X的歌手,你要去访问他,然后给他打电话问他什么时候有空,然后他告诉你“这样吧,你找我代理吧,让他告诉你”,你说变态不变态。

第三类:虚拟代理

它的意思就是说:在需要的时候才初始化主题对象。我不太明白它的具体用途是什么?

第四类:动态代理

动态代理是在实现阶段(就是编码阶段)不用关心代理是谁,而在运行阶段才指定代理哪一个对象,反过来说,自己写代理类的方式就是静态代理。

我们来举一个示例,在帝都很多人都有过找房子的经历,以此为例。首先得有人,定义一个接口租房子,它有两个方法:找房子,签合同。


public interface IRent {

    public void searchHouse();
    public void contractHouse();
}

实现这个方法,其代码如下:

public class Renter implements IRent {

    String name="";

    public Renter(String _name){
        this.name=_name;
    }

    @Override
    public void searchHouse() {
        System.out.println(this.name+"正在找房子");

    }

    @Override
    public void contractHouse() {
        System.out.println(this.name+"正在签合同");
    }
}

接下来实现代理类,其代码如下:


public class RentProxy implements InvocationHandler {

    //被代理的对象
    Object target=null;

    public RentProxy(Object _object){
        this.target=_object;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //执行被代理的方法
        //在执行这个被代理的方法前后可以执行你想执行的操作,比如打印日志,判断Session等
        return method.invoke(this.target,args);
    }
}

动态代理请务必实现InvocationHandler接口,这个接口只有一个方法,在这个方法中调用被代理类的实际方法。这一点很不好理解,可以在此先记住这个,以后慢慢理解。

再看场景类的具体实现:


public class Client {
    public static void main(String[] strings){
        //定义房客
        IRent iRent=new Renter("张三");
        //定义handler
        InvocationHandler invocationHandler=new RentProxy(iRent);
        //动态产生一个代理
        IRent proxy= (IRent)Proxy.newProxyInstance(iRent.getClass().getClassLoader(),new Class[]{IRent.class},invocationHandler);
        proxy.searchHouse();
        proxy.contractHouse();
    }
}

场景类分四步走:

  1. 定义房客

  2. 定义Handler

  3. 使用jdk 提供的Proxy类动态产生一个代理类

  4. 通过产生的动态代理类,去执行相应的方法

对比以上的场景类,基本就是按照这个思路来的。

以上这些就是代理模式的相关内容。

相关文章

  • 设计模式之代理模式

    设计模式之代理模式 10分钟看懂动态代理设计模式(升级篇)-对这篇动态代理模式的思路整理 仿JDK实现动态代理逻辑...

  • 代理模式

    设计模式之代理模式 什么是代理模式? 指的事代理对象为其他对象提供代理以控制对被...

  • Java设计模式之代理模式

    Java设计模式之代理模式 代理模式 静态代理 动态代理 为什么需要代理 通过代理,我们能够不用知道委托人是谁,而...

  • Java代理模式之JDK动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 JDK动态代理是java.lang.reflect...

  • 设计模式之代理模式2

    设计模式之代理模式运用 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对...

  • 设计模式之代理模式

    设计模式之代理模式 简介 代理模式是结构型设计模式。 当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过...

  • 设计模式之代理模式

    title: 设计模式之代理模式date: 2018-08-15 20:25:42tags: 设计模式 笔记 Ja...

  • java设计模式之代理模式(静态代理)

      今天给大家分享的是java设计模式之代理模式中的静态代理模式,动态代理模式将在后面文章中给出。如有不足,敬请指...

  • Android 代理模式

    Android 设计模式系列文章 Android 23种设计模式 前言 代理模式可能是我们平时开发中最常见的模式之...

  • 设计模式之代理模式

    设计模式之代理模式 1.代理模式的定义 为其他对象提供一种代理以控制对这个对象的访问. 2.代理模式的使用场景 当...

网友评论

    本文标题:设计模式之代理模式

    本文链接:https://www.haomeiwen.com/subject/vfojkttx.html