静态代理模式中,真实角色必须是事先已经存在的,并将其作为代理对象的内部属性,并且真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀。那么,如果事先并不知道真实角色,该如何使用代理呢?这个问题
提问网站可以通过Java的动态代理类来解决。
设计模式
1.静态代理模式
使用场合:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
涉及的角色:
抽象角色:
声明真实对象和代理对象的共同接口;
代理角色:
代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:
代理角色所代表的真实对象,是我们最终要引用的对象。
最好的老师是代码,下面是本人敲的一个静态代理代码示例
Java代码 收藏代码
package com;
/**
* 车站接口-【抽象角色】
*
* @author abing
*
*/
interface Station {
void sellTicks();// 卖票
void transport();// 运输乘客
}
/**
* 火车站实现类-【具体角色】
*
* @author abing
*
*/
class TrainStationImpl implements Station {
@Override
public void sellTicks() {
System.out.println("TrainStation sell tickets");
}
@Override
public void transport() {
System.out.println("TrainStation transport passenger");
}
}
/**
* 该类做为火车站的一个代理直接供客户端调用-【代理角色】
*
* @author abing
*
*/
class StationProxy implements Station {
Station sta = new TrainStationImpl();
@Override
public void sellTicks() {
sta.sellTicks();//代理类中调用真实角色的方法。
}
public void otherOperate() {
System.out.println("do some other things...");
}
@Override
public void transport() {
System.out.println("StationProxy can not transport");
}
}
/**
* 客户端测试类
*
* @author abing
*
*/
public class StaticProxyDemo {
public static void main(String[] args) {
Station station = new StationProxy();//客户端直接操作代理类,避免了客户端与真实类的直接交涉
station.sellTicks();
}
}
2.动态代理模式
静态代理模式中,真实角色必须是事先已经存在的,并将其作为代理对象的内部属性,并且真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀。那么,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。
动态代理必需用到以下两个类。
(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。用于完成真实角色中方法的调用。(2).Proxy:该类即为动态代理类,作用类似于静态代理模式的代理类
最好的老师是代码,下面是本人敲的一个动态代理代码示例
Java代码 收藏代码
package com.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 车站接口-【抽象角色】
* @author abing
*
*/
interface Station {
void sellTicks();// 卖票
}
/**
* 火车站实现类-【具体角色】
* @author abing
*
*/
class TrainStationImpl implements Station {
@Override
public void sellTicks() {
System.out.println("TrainStation sell tickets");
}
}
/**
* 使用动态代理模式必须实现InvocationHandler接口,该接口中仅定义了一个方法:
* invoke(Object obj,Method method, Object[] args)。
* 在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组
*
* @author abing
*
*/
class InvocationHandlerImpl implements InvocationHandler {
Object proxyobj;
public InvocationHandlerImpl(Object object) {
this.proxyobj = object;
}
@Override
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
System.out.println("start doing .........");
method.invoke(proxyobj, args);//调用被代理对象proxyobj的方法method,传入一个参数组args
System.out.println("stop doing .........");
return null;
}
}
/**
* 客户端测试类
* @author abing
*
*/
public class DynamicProxyDemo {
public static void main(String[] args) {
Station stationImpl = new TrainStationImpl();//将要被代理的真实对象
/**
* 动态代理就好处在这里,不管这里是要代理什么对象,I
* nvocationHandlerImpl与Proxy中代码都不必改变,
* 都是用下面同样的方式去产生代理对象
*/
InvocationHandler handler = new InvocationHandlerImpl(stationImpl);//用InvocationHandler的实现类包装真实的被代理角色
ClassLoader loader = handler.getClass().getClassLoader();//获取当期那java程序的类装在器Classloadler
Class<?>[] interfaces = stationImpl.getClass().getInterfaces();//获取被代理角色实现的所有接口
/**
* Proxy类是动态代理模式涉及到的另一个重要的类,该类即为动态代理类,作用类似于静态代理模式中的代理类StationProxy,
* 它有一个重要方法tatic Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例。
* 其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组,传递此参数以使产生的代理对象可以当做真实类任意实现接口的子类来用,
* h是调用处理器InvocationHandler。
*/
Station station = (Station) Proxy.newProxyInstance(loader, interfaces,handler);
station.sellTicks();//将会去执行DynamicProxy的invoke方法,完成对目标对象方法的调用
}
}
分享到:
相关推荐
java中的装饰模式及动态代理模式示例源码,并且手写数据库连接池,以及展示动态代理模式在连接池中的使用
java设计模式示例 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型...
示例说明代理模式、Java动态代理的JDK实现和cglib实现。
通过房产中介的例子介绍了java代理的实现
* 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法调用 * * 作用 * 1.保护被代理对象 * 2.增强被代理对象 * 3.完全...
主要介绍了Java动态代理模式简单案例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
文章目录一、代理模式定义二、代理模式的结构和说明三、代理模式的分类四、代理模式示例五、动态代理1、JDK动态代理JDK动态代理使用步骤JDK动态代理示例JDK动态代理实现原理JDK动态代理局限性2、CGLIB动态代理CGLIB...
静态代理、装饰者、动态代理1. 静态代理设计模式1.1 ...代理模式是Java常见的设计模式之一。 代理模式是指不直接调用实际对象,而是通过调用代理,来间接的调用实际的对象。 为什么要采用这种间接的形式来调用对象呢?
文件类型为PDF文件,此文档对20多种java设计模式进行了详细讲解,在中文讲解的过程中还附有代码示例给学习者进行参考,使学习者通过实践更容易理解设计模式的原理。 本文档目录: 1.工厂模式 2.单例模式 3.建造...
* 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法调用 * * 作用 * 1.保护被代理对象 * 2.增强被代理对象 * 3.完全...
为其他对象提供一种代理以控制对这个对象的访问。这里的代码示例使保护代理的代码,再其中使用的Java的动态代理。
我自己的通过查找资料搭建的SSM框架,并且带有部分的代码示例
对于C#的委托、代理概念所使用的Callback(回调模式--参见本人的“第一个C#程序Hello World ”资源)来看,Java Swing编程是纯粹的OO语言、是一种非常优雅的编程语言(本人认为)--而C#的学习好像非常强调所谓的OO思想...
介绍JAVA反射机制,及代理模式,展示相应示例.
第九节 代理模式 第十节 命令模式 第十一节 观察者模式 第十二节 策略模式 第十三节 建造者模式 第十四节 适配器模式 第十五节 桥接模式 第十六节 装饰器模式 第十七节 迭代器模式 第十八节 中介者模式 第十九节 ...
方案做了一个示例程序,即利用swing类库和基于前面介绍的设计模式,以按钮 为例创建了一个界面生成器,该按钮生成器能按照用户输入的属性生成具有该属 性的swingYXL格的按钮,并且生成相应的java代码,用户也可以...
代码包含 适配器模式示例 外观模式示例 装饰器模式示例 代理模式示例 桥梁模式示例
java设计模式包括常用的如工厂,多线程,迭代器,代理,观察者,建造者,模版模式等等,以及代码示例
代理模式 静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量
Java设计模式示例的UML图 该项目列出了“ ”的UML图。当您单击图图像时,该图将在“图映射”中打开。如果您想了解Diagram Map,请参阅。 行为模式 责任链 命令 口译员 迭代器 调解员 纪念 观察者 状态 战略 模板方法...