`

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动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    用Java实现的代理模式之动态代理

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

    java代理模式示例源码

    在给定的“java代理模式示例源码”中,我们可以通过房产中介的例子来理解这种模式。 房产中介在现实生活中,是客户与房东之间的桥梁,它可以代表客户处理租赁事宜,也可以在房东和客户之间传递信息,这与代理模式的...

    优秀的设计模式示例-动态代理模式

    动态代理模式是一种在运行时创建代理对象以控制或扩展原有对象行为的设计模式。它允许我们为现有的对象提供一种代理以增强其功能,而无需修改原对象的代码。动态代理模式通常用于实现对目标对象的额外操作,如日志...

    proxy.rar java三种代理模式源码

    这个"proxy.rar"压缩包中包含了这三种代理模式的源代码示例,以及对泛型的应用。 1. 静态代理: 静态代理是最基础的代理形式,它通过创建一个代理类来实现目标接口,并在代理类中调用目标对象的方法。这种方式需要...

    JAVA设计模式之代理模式实例

    以下是一个简单的静态代理模式示例: ```java // 目标接口 interface Target { void doSomething(); } // 目标实现类 class RealTarget implements Target { @Override public void doSomething() { System....

    java 动态代理模式 适配器模式

    Java动态代理模式与适配器模式是两种在软件设计中常用的设计模式,它们都有各自的优点和应用场景。在Java中,动态代理模式主要依赖于Java的反射API和InvocationHandler接口,而适配器模式则用于解决不同接口之间的...

    java设计模式示例,demo

    在这个"java设计模式示例,demo"压缩包中,可能包含了一些常见设计模式的实际代码示例。下面我们将详细探讨一些重要的设计模式及其在Java中的应用。 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局...

    java设计模式示例

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

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    ### Java 代理模式详解 #### 1. 代理模式概览 代理模式是一种设计模式,主要目的是为了控制或提供对某对象的访问。在代理模式中,代理对象充当客户端与真实对象之间的中介,使得客户端可以通过代理对象间接地访问...

    Java23个设计模式简单示例

    13. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。在示例中,Proxy可能作为Subject的替代,控制对RealSubject的访问。 14. **职责链模式**:避免请求的发送者和接收者之间的耦合。将这些对象连成...

    设计模式Java版(包括23个模式的java代码示例)

    8. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问,常用于延迟加载、安全控制等场景。 9. **桥接模式**:将抽象部分与它的实现部分分离,使它们可以独立地变化。 10. **组合模式**:允许你将对象...

    java jdk 动态代理 演示demo

    首先,我们需要了解Java中的代理模式。代理模式是一种设计模式,它提供一个代理类来控制对原对象的访问。在静态代理中,我们通过编写额外的代理类来实现这一目标,但在动态代理中,代理类是在运行时生成的,无需预先...

    Java两种代理模式案例

    在Java中,代理模式有两种主要实现方式:静态代理和动态代理。下面将详细介绍这两种代理模式,并结合`ProxyDemo`案例进行说明。 ### 1. 静态代理 静态代理是最基础的代理形式,它通过显式创建一个代理类来实现对...

    JAVA静态代理和动态代理

    以下是一个简单的静态代理模式示例: 1. 定义接口: ```java public interface Service { void doSomething(); } ``` 2. 实现目标对象: ```java public class RealService implements Service { @Override ...

    java动态代理实例

    在这个实例中,我们将深入探讨Java动态代理的核心概念,以及如何利用它来实现拦截器模式。 首先,我们需要了解Java动态代理的基本原理。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....

    JAVA动态代理模式.pdf

    Java动态代理模式是一种设计模式,它可以为其他对象提供一种代理以控制对这个对象的访问。在Java中,动态代理是利用反射机制实现的,可以在运行时动态生成代理类和对象。它主要应用于需要控制对象访问、提供额外功能...

    java动态代理 经典文章(word 2007格式的)

    - `Java动态代理模式.docx`可能详细讲解了动态代理模式的原理和实现,包括如何创建代理对象和实现`InvocationHandler`。 - `动态代理详解.docx`则可能深入讨论了Java动态代理的细节,包括实际应用场景和常见问题。...

    代理模式的使用示例程序

    在这个"代理模式的使用示例程序"中,我们很可能会看到如何通过拦截器(Interceptor)来实现代理。 首先,让我们理解代理模式的基本结构。在代理模式中,有三个主要的角色:原始对象(Real Subject)、代理对象...

Global site tag (gtag.js) - Google Analytics