适用于为不同操作添加共同的额外行为。通过代理对象访问目标对象,这样可以增加对目标对象的额外操作,达到扩展目标对象功能的目的,如spring事务、AOP等。

  要点:1)抽象角色:通过接口或抽象类声明真实角色实现的业务方法。(例子中的Move)

     2)代理角色:实现抽象角色,是真实角色的代理(例子中的*Proxy)

     3)真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。(例子中的MoveImpl)

一、静态代理

1、继承实现静态代理

移动接口

public interface Move {
public void move();
}

移动实现类

public class MoveProxy implements Move {
public void move() {
System.out.println("汽车正在运行......");
}
}

车代理类

public class CarProxy extends MoveImpl {
@Override
public void move() {
long start_time = new Date().getTime();
System.out.println("汽车开始运行......");
super.move();
long end_time = new Date().getTime();
System.out.println("汽车结束运行,运行时间:" + (end_time - start_time));
}
}

测试

public class Model {
public static void main(String[] args) {
CarProxy carProxy = new CarProxy();
carProxy.move();
}
}

2、聚合实现静态代理

  推荐使用聚合实现动态代理,这样可以方便实现多个代理顺序交换,方便扩展,如下

移动接口

public interface Move {
public void move();
}

移动实现类

public class MoveProxy implements Move {
public void move() {
System.out.println("汽车正在运行......");
}
}

车代理类

public class CarProxy extends MoveImpl {
@Override
public void move() {
long start_time = new Date().getTime();
System.out.println("汽车开始运行......");
super.move();
long end_time = new Date().getTime();
System.out.println("汽车结束运行,运行时间:" + (end_time - start_time));
}
}

日志代理

public class LogProxy implements Move {

    private Move obj;

    public LogProxy(Move obj) {
this.obj = obj;
} public void move() {
System.out.println("日志开始......");
obj.move();
System.out.println("日志结束......");
}
}

测试

public class Model {
public static void main(String[] args) {
//推荐使用聚合实现动态代理,这样可以方便实现多个代理顺序交换,方便扩展,如下
MoveImpl moveProxy = new MoveImpl();
CarPropxy carPropxy = new CarPropxy(moveProxy);
LogProxy logProxy = new LogProxy(carPropxy);
logProxy.move(); System.out.println();
MoveImpl moveProxy1 = new MoveImpl();
CarPropxy carPropxy1 = new CarPropxy(moveProxy1);
LogProxy logProxy1 = new LogProxy(carPropxy1);
logProxy1.move();
}
}

二、动态代理

移动接口

public interface Move {
public void move();
}

移动实现类

public class MoveProxy implements Move {
public void move() {
System.out.println("汽车正在运行......");
}
}

日志代理

public class LogHandler implements InvocationHandler {

    private Object obj;

    public LogHandler(Object obj) {
this.obj = obj;
} public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("日志开始......");
method.invoke(obj);
System.out.println("日志结束.......");
return null;
}
}

时间代理

public class TimeHandler implements InvocationHandler {

    private Object obj;

    public TimeHandler(Object obj) {
this.obj = obj;
} public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long start_time = new Date().getTime();
System.out.println("汽车开始运行......");
method.invoke(obj);
long end_time = new Date().getTime();
System.out.println("汽车结束运行,运行时间:" + (end_time - start_time));
return null;
}
}

测试

public class Model {
public static void main(String[] args) {
MoveImpl move = new MoveImpl();
Class c = move.getClass(); TimeHandler t = new TimeHandler(move);
Move m = (Move) Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), t);
LogHandler l = new LogHandler(m);
Move m1 = (Move) Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), l);
m1.move();
}
}

二者区别:JAVA学习篇--静态代理VS动态代理

代码:https://github.com/shaoyesun/jdk_test.git

java设计模式(四)代理模式的更多相关文章

  1. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

  2. java设计模式6——代理模式

    java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代 ...

  3. 夜话JAVA设计模式之代理模式(Proxy)

    代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...

  4. Java设计模式:代理模式(转)

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一 ...

  5. Java设计模式:代理模式(二)

    承接上文 三.计数代理 计数代理的应用场景是:当客户程序需要在调用服务提供者对象的方法之前或之后执行日志或者计数等额外功能时,就可以用到技术代理模式.计数代理模式并不是把额外操作的代码直接添加到原服务 ...

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

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

  7. JAVA设计模式:代理模式&& 装饰模式区别

    在前面学习了代理模式和装饰模式后,发现对两者之间有时候会混淆,因此对两者进行了区别和理解: 装饰模式你可以这样理解,就像糖一样,卖的时候商家大多要在外面包一层糖纸,其实原本还是糖. public in ...

  8. Java设计模式:代理模式(一)

    问题的提出 现在生活中,常常在微信朋友圈里面看到代购的信息,你想在国外买什么,香港买什么,但是又懒得自己过去,于是常常委托别人帮忙买奶粉买那啥的.这类问题的缘由是因为客户和原产地没有直接的接触,所以需 ...

  9. java设计模式之代理模式 ,以及和java 回调机制的区别

    java 代理模式就是: 将自己要做的事交给别人去做(这个别人就是代理者,自己就是被代理者),为什么自己能做的要交给别人去做了?假如一个小学生小明,现在要写作业,但是又想玩游戏,他更想玩游戏,并且不想 ...

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

    前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils ...

随机推荐

  1. 【SLAM】安装 g2o_viewer

    2017年2月8日,那是一个阴天.为了完成高翔博士的<一起做RGB-D SLAM>教程,我在 Ubuntu 14.04 安装 g2o.遇到困难,怎奈我眼瞎,找错了方向,浪费时间,没有成功安 ...

  2. 【Tomcat】Tomcat容器 web.xml详解

      Tomcat的安装目录下的conf目录下的web.xml文件有许多配置,例如: <init-param> <param-name>debug</param-name& ...

  3. 建立ARM交叉编译环境 (arm-none-linux-gnueabi-gcc with EABI)【转】

    转自:http://lib.csdn.net/article/embeddeddevelopment/60172?knId=886 建立ARM交叉编译环境 (arm-none-linux-gnueab ...

  4. Linux内核Ramdisk(initrd)机制【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/03/30/2396827.html 摘要:对于Linux用户来说,Ramdisk并不陌生,可是为什么需 ...

  5. Git log diff config高级进阶

    Git 历史相关和 git config 高级进阶 前一段时间分享了一篇<更好的 git log>简要介绍怎么美化 git log 命令,其中提到了 alias命令,今天再继续谈谈 git ...

  6. Dapper实用教程

    Dapper是什么? Dpper是一款.Net平台简单(Simple)的对象映射库,并且Dapper拥有着“微型ORM之王”的称号.就速度而言与手写ADO.NET SqlDateReader相同.OR ...

  7. linux查看内存、CPU占用资源最多的进程

    [内存占用] #利用ps命令,默认使用ps参数会显示的结果 ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 ...

  8. UE简单配置

    1 头上显示文件位置和名称,视图->视图列表——>打开文件标签,在右面点放大 2 函数列表,视图->视图列表——>打开文件标签

  9. MySQL基础 - 权限配置

    为数据库创建特定的用户和密码 mysql>grant all privileges on <database>.* to '<username>'@'localhost' ...

  10. SonarQube代码质量管理工具的安装(Linux)

    一.安装配置sonar 1.Sonar介绍 Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具, ...