第五章———代理模式

有两天没写博客了,主要是这两天比较疲惫;于是乎买了本书《牧羊少年奇幻之旅》一本《超越华尔街》一本;主要为了寻找迷失的方向和自己当初的理想;不忘初心,方得始终;今后更当修身养性,寻求内心的富足;好了今天我们来看看使用率相当高的代理模式;
看看定义:
Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供
一种代理以控制对这个对象的访问。)
由定义可见;对其他对象提供一种代理,那就是有代理者和被代理者(委托类);就像总统发言人一样,他所说idea都代表总统的意思;他是总统的代理者;理清了原理我们就清晰多了后续,做什么我们就不会有那么多为什么。

首先我们看下静态代理:
假设有这么一个场景:我们都知道京东商城搞得是自营,所以国内服务和质量和速度做的很好;如果所有货源都从北京总部发货那肯定是做不到次日达或者当日达的;那么就要在各地设立分部仓储;这个是不是可以理解为代理模式;我寻找一个代理仓库负责这一片地方的货物供给:好了我们写了Demo;

定义一个统一仓库的接口

    package com.ldl.proxytest;
   public interface Warehouse {
public void receiveOrder();

public void findProduct();

public void packUpProduct();

public void sendOutProduct();
      }

定义一个仓库的实现:

          package com.ldl.proxytest;
  public class WarehouseImpl implements Warehouse {
private String address;

public WarehouseImpl(String address) {
    super();
    this.address = address;
}

@Override
public void receiveOrder() {
    System.out.println(address + "收到订单了");

}

@Override
public void findProduct() {
    System.out.println(address + "在寻找订单");

}

@Override
public void packUpProduct() {
    // TODO Auto-generated method stub
    System.out.println(address + "在打包订单了");

}

@Override
public void sendOutProduct() {
    // TODO Auto-generated method stub
    System.out.println(address + "发出订单包裹了");

}
  }

我们在搞一个代理类:

package com.ldl.proxytest;
 public class WareHouseProxy implements Warehouse {
private Warehouse warehouse;

public WareHouseProxy(Warehouse warehouse) {
    super();
    this.warehouse = warehouse;
}

@Override
public void receiveOrder() {
    // TODO Auto-generated method stub
    this.warehouse.receiveOrder();

}

@Override
public void findProduct() {
    // TODO Auto-generated method stub
    this.warehouse.findProduct();
}

@Override
public void packUpProduct() {
    // TODO Auto-generated method stub
    this.warehouse.packUpProduct();
}

@Override
public void sendOutProduct() {
    // TODO Auto-generated method stub
    this.warehouse.sendOutProduct();
}

      }

哈哈完事了我们搞个客户端测试一下呗:

        package com.ldl.proxytest;

       public class ProxyTest {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Warehouse wareHouse = new WarehouseImpl("深圳");
    Warehouse wareHouseProxy = new WareHouseProxy(wareHouse);
    wareHouseProxy.receiveOrder();
    wareHouseProxy.findProduct();
    wareHouseProxy.packUpProduct();
    wareHouseProxy.sendOutProduct();
}

}
图片.png

欧了看到了吧效果还可以;我们用WareHouseProxy类代理WarehouseImpl;WarehouseImpl是个委托者;我委托你作为我的代理;是不是还挺简单?这就是静态代理模式;那么如果说京东像阿里一样一分为4独立运营该怎么办;难道我们要为4家分别实现一个接口分别搞一个代理吗?那么代理会不会显得冗余,代理除了调用方法不同其他是一样的;作为开发者看到重复代码就要想办法抽取;好了不卖关子了我们用动态代理解决这个问题:

动态代理即我们可以动态创建不同的代理类:

下面我们先改造一下Demo在解释:

  package com.ldl.proxytest;   
   import java.lang.reflect.InvocationHandler; 
     import java.lang.reflect.Method;
     public class WareHouseIH implements InvocationHandler {
// 被代理者
private Class cls;
// 代理谁(被代理的势力实例)
private Object obj;
public WareHouseIH(Object obj) {
    super();
    this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    Object result = method.invoke(obj, args);
    return result;
}}

测试一下:

    package com.ldl.proxytest;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    public class ProxyTest {
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Warehouse wareHouse = new WarehouseImpl("深圳");
    InvocationHandler proxyHandler = new WareHouseIH(wareHouse);
    // 我们动态创建一个代理对象
    Warehouse proxy = (Warehouse) Proxy.newProxyInstance(wareHouse.getClass().getClassLoader(),
            wareHouse.getClass().getInterfaces(), proxyHandler);
    proxy.receiveOrder();
    proxy.findProduct();
    proxy.packUpProduct();
    proxy.sendOutProduct();
    // Warehouse wareHouseProxy = new WareHouseProxy(wareHouse);
    // wareHouseProxy.receiveOrder();
    // wareHouseProxy.findProduct();
    // wareHouseProxy.packUpProduct();
    // wareHouseProxy.sendOutProduct();
}  }

InvocationHandler是JDK提供的动态代理接口,对被代理类的方法进行代理;其中invoke方法是接口InvocationHandler定义必须实现的,它完成对真实方法的调用。我
们来详细讲解一下InvocationHandler接口,动态代理是根据被代理的接口生成所有的方法,
也就是说给定一个接口,动态代理会宣称“我已经实现该接口下的所有方法了”,
所有被代理的方法都由InvocationHandler接管实际的处理任务
看一下通用类图:
 


图片.png

动态代理实现代理的职责,业务逻辑Subject实现相关的逻辑功能,两者之间没有必然的相互耦合的关系

注意 要实现动态代理的首要条件是:被代理类必须实现一个接口,回想一下前面的分
析吧。当然了,现在也有很多技术如CGLIB可以实现不需要接口也可以实现动态代理的方
式。这个我们知道就好,今天的任务是把代理搞明白;其实你清楚了原理;只要记住Proxy类即可;用时拿来即用;

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

推荐阅读更多精彩内容

  • 整体Retrofit内容如下: 1、Retrofit解析1之前哨站——理解RESTful 2、Retrofit解析...
    隔壁老李头阅读 3,232评论 2 10
  • Java代理和动态代理机制分析和应用 概述 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个...
    丸_子阅读 3,016评论 6 57
  • 原文: Dyanmic Proxy Classes 介绍 一个动态代理类是实现了多个接口存在于运行时的类,这样,一...
    半黑月缺阅读 935评论 0 0
  • 我家的布局很奇怪,书房和客厅之间有一道暗门,状似墙壁的一部分,所有第一次来家里做客的人都不知道这堵墙的后面隐有...
    清鹊阅读 290评论 0 0
  • snow是一款wordpress博客主题,布局使用了瀑布流的方式,文章三栏摆放。整个风格干净利落,并且支持自适性显...
    maolai博客阅读 192评论 0 0