代理是一种设计模式,即通过代理对象访问目标对象,这样可以在目标对象实现的基础上,增强额外的功能,即扩展目标类的功能。

通常编程中存在一种思想,即不要随意修改别人的代码或者方法,所以代理就可以在不修改目标代码的基础上扩展该目标类。代理模式的关键点在于代理对象和目标对象。代理对象对目标对象进行扩展,并会调用目标对象。

代理模式包含几个角色:

Subject:    一个接口,是代理对象和目标对象公共的接口

RealSubject:    目标对象。实现接口的类。

Proxy:    代理对象,包含对目标对象的引用,进而操作目标对象。代理对象包含和目标对象对接口一样的操作,同时还会附加其他操作,相当于对目标对象的进一步封装。

 1.静态代理

        静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.

代码示例:

接口:

public interface Image {void display();
}

目标类:

public class RealImage implements Image{@Overridepublic void display() {System.out.println("这是一张漂亮的图片");}
}

代理类:

public class ProxyImage implements Image{//接收保存目标对象private Image img;public ProxyImage(Image img) {this.img = img;}@Overridepublic void display() {System.out.println("打开图片");img.display();System.out.println("关闭图片");}
}

测试:

public class Main {public static void main(String args[]){RealImage image = new RealImage();ProxyImage proxyImage = new ProxyImage(image);proxyImage.display();}
}

结果:

静态代理可以做到不修改目标对象的前提下对目标对象扩展,但是静态代理有个缺点:代理对象需要和目标对象实现一样的接口,所以会有很多代理类,类太多。同时,一旦接口增加方法,目标对象与代理对象都要维护。

2.动态代理

        动态代理有以下特点:

1.代理对象,不需要实现接口
               2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)

3.动态代理也叫做:JDK代理,接口代理

动态代理的关键是反射

JDK中生成代理对象的API

代理类所在包:java.lang.reflect.Proxy

JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是:

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )

实例代码:

接口类和目标对象类都不变,在此基础上增加一个代理工厂类,在Main类中建立目标对象和代理对象的联系,然后代用代理对象的中同名方法

代理工厂类:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 创建动态代理对象* 动态代理不需要实现接口,但是需要知道接口的类型*/
public class ProxyFactory {private Object object;public ProxyFactory(Object object) {this.object = object;}//给目标对象生成代理对象public Object getProxyInstance() {return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(" --- start --- ");Object value = method.invoke(object, args);System.out.println(" --- end --- ");return object;}});}
}

Main类:

public class Main {public static void main(String args[]){// 目标对象Image img = new RealImage();System.out.println(img.getClass());// 给目标对象,创建代理对象Image proxy = (Image) new ProxyFactory(img).getProxyInstance();System.out.println(proxy.getClass());proxy.display();}
}

结果:

代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理

Java设计模式(三) -- 代理模式相关推荐

  1. java设计模式之代理模式多种写法(三)

    背景 代理模式属于结构型模式,代理模式也是我们开发中常用的设计模式之一,本次讲解以下几种代理模式的写法,希望可以帮助大家更快的理解代理模式,包括自己写一个动态代理的方法. 静态代理 package c ...

  2. Java 设计模式_代理模式(2016-08-19)

    概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

  3. Java设计模式-Proxy代理模式

    问题分析: 什么是代理模式呢?其实我们在生活中并不少见.对于程序员来说最常接触的莫过于代理上网了,连接大力服务器地址,就可以访问网络. 还有每天吃饭赶进度是常事,叫公司的同事帮忙带饭也是一种代理:如果 ...

  4. Java设计模式-之代理模式(动态代理)

    一.简介 1.什么叫代理模式:        简而言之就是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...

  5. java设计模式之代理模式详解

    代理模式在Java中十分常见,有如Spring实现AOP而使用动态代理,更有RPC实现中使用的调用端调用的代理服务.代理模型除了是一种设计模式之外,它更是一种思维,所以探讨并深入理解这种模型是非常有必 ...

  6. (设计模式八)java设计模式之代理模式

    一.定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二.简介: 1.意图: 为其他对 ...

  7. Java设计模式之代理模式(Proxy)

    参考http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924 1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的 ...

  8. Java 设计模式之代理模式

    1.静态代理 被代理对象和代理对象都要实现相同的接口或者继承相同的父类. 不需要修改被代理对象就可以实现对功能的扩展,缺点是如果接口发生变化,比如增加新方法,被代理对象和代理对象都需要维护. 1)首先 ...

  9. java设计模式之——代理模式

    1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2,策略模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象 ...

最新文章

  1. Maven工程引入jar包(转)
  2. python二叉树深度 判断平衡树
  3. python怎么在电脑上使用-使用python在本地电脑上快速处理数据
  4. JS中怎样获取当前年以及前后几年并构造成对象数组
  5. Sharepoint 2010 应用范围
  6. iphone开发之C++和Objective-C混编
  7. php 微商城 开源,微商城开通为什么选php开源网店系统
  8. 你知道C#中的Lambda表达式的演化过程吗?
  9. linux 修改密码和端口号_WINDOWS/LINUX系统修改管理员密码方法
  10. 【视频】Copula算法原理和R语言股市收益率相依性可视化分析
  11. 删数问题 山东理工oj2072(贪心)
  12. 微信游戏推荐系统大揭秘
  13. PS设置图片为透明背景简单操作
  14. HC-SR04超声波测距模块的原理介绍与代码实现
  15. 你们要的《Java工程师成神之路》高清版思维导图,来了!
  16. java基础之转换流
  17. 细说强网杯Web辅助
  18. 大数据应用安全研究报告
  19. SQL Server 替换越南语(越南文)音标SQL脚本
  20. 浅谈防火墙、IDS和IPS之间的区别

热门文章

  1. Linux疑难杂症解决方案100篇(八)-文本处理工具与bash的特性
  2. map初始化_需要掌握的Go基础之map:文末附面试题一道
  3. Python入门100题 | 第014题
  4. 虚拟机安装多了,怎么删除?
  5. Python编程基础:第三节 字符串方法String Methods
  6. win10下,cmd可以运行java,却不能运行javac
  7. elasticSearch6源码分析(8)RepositoriesModule模块
  8. HikariCP--一款高性能的 JDBC 连接池
  9. 千万级规模高性能、高并发的网络架构经验分享--转
  10. Design Pattern - Service Locator Pattern--转载