`

9.Java静动态代理模式示例

阅读更多
1.静态代理模式
使用场合:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
涉及的角色:
抽象角色:
声明真实对象和代理对象的共同接口;

代理角色:
代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

真实角色:
代理角色所代表的真实对象,是我们最终要引用的对象。
最好的老师是代码,下面是本人敲的一个静态代理代码示例
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:该类即为动态代理类,作用类似于静态代理模式的代理类
最好的老师是代码,下面是本人敲的一个动态代理代码示例
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方法,完成对目标对象方法的调用
	}

}


2
3
分享到:
评论

相关推荐

    java装饰模式及动态代理模式示例源码

    java中的装饰模式及动态代理模式示例源码,并且手写数据库连接池,以及展示动态代理模式在连接池中的使用

    java设计模式示例

    java设计模式示例 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型...

    java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar

    * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法调用 * * 作用 * 1.保护被代理对象 * 2.增强被代理对象 * 3.完全...

    Java代理示例代码

    示例说明代理模式、Java动态代理的JDK实现和cglib实现。

    深入浅出java设计模式(高清中文PDF)

    文件类型为PDF文件,此文档对20多种java设计模式进行了详细讲解,在中文讲解的过程中还附有代码示例给学习者进行参考,使学习者通过实践更容易理解设计模式的原理。 本文档目录: 1.工厂模式 2.单例模式 3.建造...

    java代理模式示例源码

    通过房产中介的例子介绍了java代理的实现

    NiagaraAX开发者向导-docDeveloperPDF

    示例..... 20 建立枚举类型(Buildiing Enums) .............. 23 概览..... 23 示例..... 23 建立 Complex 对象(Building Complexes) . 25 BStructs 与 BComponents ........................ 25 建立 BComplex ...

    java设计模式【之】静态代理【源码】【场景:帮爸爸买菜】.rar

    * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法调用 * * 作用 * 1.保护被代理对象 * 2.增强被代理对象 * 3.完全...

    Java设计模式:静态代理、装饰者、动态代理详解

    静态代理、装饰者、动态代理1. 静态代理设计模式1.1 ...代理模式是Java常见的设计模式之一。 代理模式是指不直接调用实际对象,而是通过调用代理,来间接的调用实际的对象。 为什么要采用这种间接的形式来调用对象呢?

    Java设计模式及应用场景之《代理模式》

    文章目录一、代理模式定义二、代理模式的结构和说明三、代理模式的分类四、代理模式示例五、动态代理1、JDK动态代理JDK动态代理使用步骤JDK动态代理示例JDK动态代理实现原理JDK动态代理局限性2、CGLIB动态代理CGLIB...

    Java简单实现动态代理模式过程解析

    主要介绍了Java动态代理模式简单案例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    JAVA上百实例源码以及开源项目源代码

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    JAVA上百实例源码以及开源项目

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    详解Observer Pattern(观察者模式)在Java中的使用原理

    对于C#的委托、代理概念所使用的Callback(回调模式--参见本人的“第一个C#程序Hello World ”资源)来看,Java Swing编程是纯粹的OO语言、是一种非常优雅的编程语言(本人认为)--而C#的学习好像非常强调所谓的OO思想...

    Java 基础核心总结 +经典算法大全.rar

    代理模式 静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量

    JAVA反射 代理 PPT

    介绍JAVA反射机制,及代理模式,展示相应示例.

    代理模式代码

    为其他对象提供一种代理以控制对这个对象的访问。这里的代码示例使保护代理的代码,再其中使用的Java的动态代理。

    动态代理+静态代理+单利模式+定时任务的SSM+maven框架

    我自己的通过查找资料搭建的SSM框架,并且带有部分的代码示例

Global site tag (gtag.js) - Google Analytics