01.什么是代理模式?

  解析:代理(Proxy):代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,

而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。

这些额外的操作通常需要与实际对象进行通信。

 02.代理的组成都有什么?

  解析:由三部分组成,分别是:抽象对象(Subject 接口),真实对象(RealSubject 实现了Subject接口),代理对象(ProxySubject)

        

  03.代理对象作用场景?

  解析:

   第一,远程代理,也就是为一个对象在不同的地址空间提供局部代表.这样可以隐藏一个对象存在于不同地址空间的事实[DP]

第二:需补代理,是根据需要创建开销很大的对象.通过它来存放实例化需要很长时间的真实对象[DP].这样就可以达到性能的最优化.

   04.代理有几种?

解析:代理有两种类型,即 动态代理和静态代理,

动态代理:动态代理,在Struts和Spring等框架中都用到了动态代理,用于帮助程序员生成其要使用的类的子类或本类,这样框架就可以再代码之前做一些动作,

比如前置方法增强,后置方法增强,记录日志,异常捕获等等.在程序运行时运用反射机制动态创建而成

(插: AOP(AspectOrientedProgramming):将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,

我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码---解耦。)

      静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。

    动态代理 VS 静态代理:

静态代理类优缺点

优点:

 代理使客户端不需要知道实现类是什么,怎么做的,而客户端只需知道代理即可(解耦合)

缺点:

1)代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,

除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

2)代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。

如上的代码是只为UserManager类的访问提供了代理,但是如果还要为其他类如Department类提供代理的话,就需要我们再次添加代理Department的代理类。

 静态代理---------->案列

 01.创建一个接口:

package cn.work.proxy;
//抽象对象
public interface Subject {
public String request();
}

 02.创建一个实现类:

package cn.work.proxy;
//真实对象
public class RealSubject implements Subject { public String request() {
return "真实对象";
} }

 03.创建一个代理对象:

package cn.work.proxy;

public class ProxySubject {

	//把抽象对象组成代理对象的字段
private Subject sub; public Subject getSub() {
return sub;
} public void setSub(Subject sub) {
this.sub = sub;
} public String reqString(){
System.out.println("代理增强");
return sub.request();
}
}

 04.创建Test测试类:

//对象代理
@Test
public void test09() {
Subject sub=new RealSubject();
ProxySubject ps=new ProxySubject();
ps.setSub(sub);
System.out.println(ps.reqString());
}

  

  动态代理优点:

  动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler.invoke)。这样,

在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使我们的类职责更加单一,复用性更强

  

  动态代理--------->实例

  01.创建一个DAO接口

package cn.work.dao;

import cn.work.entity.User;

public interface UserDao {
public void add(User user);
}

  02.创建一个DAO接口的实现

package cn.work.dao;

import cn.work.entity.User;

public class UserImpl implements UserDao{

	public void add(User user) {
System.out.println("sava success");
} }

  03.创建测试类

     @Test
public void test10(){
User user=new User();
final UserDao userDao=new UserImpl();
UserDao u =(UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
userDao.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("代码增强");
return method.invoke(userDao, args);
}
} );
u.add(user);
}

  参数说明:  

  Proxy.newProxyInstance(loader, interfaces, h)

  loader:类加载器,传入你要代理的对象,通过 对象名.getClass().getClassLoader()来拿到该对象的类加载器.

  interfaces:被代理对象的所有实现接口的集合

  InvocationHandler 是代理实例的调用处理程序 实现的接口
 实现InvcationHandler的米明内部类,
new InvcationHandler(){
     public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
		......
return ....;
}
  }

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 设计模式_代理模式(2016-08-19)

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

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

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

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

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

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

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

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

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

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

    所谓的代理模式就是为其它类或对象提供一个代理以控制对这个对象的访问.那么常见的代理有远程代理,虚拟代理,保护代理,智能代理. 1. 远程代理:为一个不同地址空间的对象提供一个本地代理对象. 2. 虚拟 ...

随机推荐

  1. Java位操作

    无论说是在哪一门计算机语言,位操作运算对于计算机来说肯定是最高效的,因为计算机的底层是按就是二进制,而位操作就是为了节省开销,加快程序的执行速度,以及真正的实现对数的二进制操作.      使用位操作 ...

  2. Unity 发布的 WebGL 使用SendMessage传递多个参数

    如果要实现Unity与浏览器的数据交互一般都会采用两种方式 方法一: Application.ExternalCall("SayHello","helloworld&qu ...

  3. python实战===使用随机的163账号发送邮件

    import linecache import smtplib import time import linecache import random #算出txt的行数,163账号_2.txt中,每一 ...

  4. this和super关键字在构造器中放置第一行的原因

    this()在第一行的原因就是: 为保证父类对象初始化的唯一性. 我们假设一种情况, 类B是类A的子类, 如果this()可以在构造函数的任意行使用, 那么会出现什么情况呢? 首先程序运行到构造函数B ...

  5. python 中self理解

    python类的方法和普通函数的区别--python中类的方法必须有一个额外的参数:self 假如创建一个新的类Myclass,类中有一个方法method(arg1,arg2),b实例化Myclass ...

  6. Qt控件窗体区域区分

    控件窗体区域区分几何参数: 指的是窗口的大小和位置,一个窗口有两套几何参数,一套是窗口外边框所占的矩形区域,另一套是窗口客户区所占的矩形区域,所谓窗口客户区就是窗口中除去边框和标题栏用来显示内容的区域 ...

  7. 剑指OFFER——顺时针打印矩阵

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8 ...

  8. BZOJ 3028 食物 生成函数

    Description 明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么NC,他又幻想了他应 该带一些什么东西.理所当然的,你当然要帮他计算携带N件物品的方案数.他这 ...

  9. sublime text 的小细节设置,让你的代码更优美

    这些属性都可以在 首选项>设置-默认 里修改下面也会介绍几个比较常用的几个插件 字体大小: "font_size": 17 高亮编辑中的一行 "highlight_ ...

  10. (译+注解)node.js的C++扩展入门

    声明:本文主要翻译自node.js addons官方文档.部分解释为作者自己添加. 编程环境: 1. 操作系统 Mac OS X 10.9.51. node.js v4.4.22. npm v3.9. ...