- 浏览: 140645 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
chxiaowu:
不错。1111111111
Java静动态代理模式示例 -
kufish001:
引用 当执行 java ***.class 的时候, j ...
深入探讨Java的类加载机制 -
centgo:
Vector 是线程安全的,ArrayList速度>Ve ...
ArrayList,Vector, LinkedList 的存储性能和特性 -
sonsyboy:
JVM的工作原理,谢谢博主!
解析JAVA中的内存分配 -
zhaoxudonglove:
现在越来越觉得java基础很重要而且还很有趣了!谢谢博主的解析 ...
解析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 连接池
2008-12-07 19:01 756package jo.service.webservice; ... -
Java中利用Reflection API优化代码
2008-12-07 19:00 1060摘要 开发者通过各 ... -
深入探讨Java的类加载机制
2008-12-07 18:57 2222Java 语言是一种具有动态性的解释型编程语言,当指定程序 ... -
解析JAVA中的内存分配
2008-12-07 18:55 2026照编译原理的观点 ... -
BASE64编码规则
2008-12-07 18:18 55351、编码规则: Base64编 ... -
Servlet读取Cookie
2008-12-07 18:17 5441Cookie概述 Cookie是服务器发送给浏览器的体 ... -
Java同步机制:sychronized对代码影响
2008-12-07 18:12 1367Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用 ... -
hibernate二级缓存攻略
2008-06-21 17:05 1145文章来源:http://www.iteye.com/topic ... -
实战DDD(Domain-Driven Design领域驱动设计)
2008-06-17 17:47 1528http://www.jdon.com/mda/ddd.htm ... -
容器和bean的基本原理
2008-01-23 14:46 1261org.springframework.beans及org.s ... -
注入依赖
2008-01-23 14:45 1029依赖注入(DI)背后的基本原理是对象之间的依赖关系(即一起工作 ... -
提高JSP的性能
2008-01-23 14:39 878方法一:在servlet的init() ... -
JSTL
2008-01-23 14:35 1586JavaServer Pages Standard Tag L ... -
EL 表达式
2008-01-23 14:34 4729JSP2.0之后,EL已经正式纳入成为标准规范之一。 JSF ... -
挖掘Jakarta Commons中隐藏的宝贝(二)
2008-01-23 14:32 10832.Commons Collections中的算子 算子成为C ... -
挖掘Jakarta Commons中隐藏的宝贝(一)
2008-01-23 14:31 1104如果你不熟悉Jakarta Commons话,那么很有可能你已 ... -
海量数据库的查询优化及分页算法方案
2008-01-23 14:20 932随着“金盾工程”建设 ... -
ServletContext接口
2007-12-10 18:24 1520对于web容器来说,ServletContext接口定义了一个 ... -
java学习的四个阶段(二)
2007-12-01 20:15 1159第三阶段: 您将学习 J2EE 技术 ... -
java学习的四个阶段(一)
2007-12-01 20:13 1048第一阶段: 您将学习 JAVA 编程的基础部分,即 J2SE ...
相关推荐
装饰模式和动态代理模式是Java编程中两种非常重要的设计模式,它们都在代码的扩展性和灵活性方面发挥着关键作用。下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。...
### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...
在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...
在给定的“java代理模式示例源码”中,我们可以通过房产中介的例子来理解这种模式。 房产中介在现实生活中,是客户与房东之间的桥梁,它可以代表客户处理租赁事宜,也可以在房东和客户之间传递信息,这与代理模式的...
Java动态代理模式与适配器模式是两种在软件设计中常用的设计模式,它们都有各自的优点和应用场景。在Java中,动态代理模式主要依赖于Java的反射API和InvocationHandler接口,而适配器模式则用于解决不同接口之间的...
java设计模式示例 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型...
动态代理模式是一种在运行时创建代理对象以控制或扩展原有对象行为的设计模式。它允许我们为现有的对象提供一种代理以增强其功能,而无需修改原对象的代码。动态代理模式通常用于实现对目标对象的额外操作,如日志...
以下是一个简单的静态代理模式示例: ```java // 目标接口 interface Target { void doSomething(); } // 目标实现类 class RealTarget implements Target { @Override public void doSomething() { System....
在Java中,代理模式有两种主要实现方式:静态代理和动态代理。下面将详细介绍这两种代理模式,并结合`ProxyDemo`案例进行说明。 ### 1. 静态代理 静态代理是最基础的代理形式,它通过显式创建一个代理类来实现对...
首先,我们需要了解Java中的代理模式。代理模式是一种设计模式,它提供一个代理类来控制对原对象的访问。在静态代理中,我们通过编写额外的代理类来实现这一目标,但在动态代理中,代理类是在运行时生成的,无需预先...
- `Java动态代理模式.docx`可能详细讲解了动态代理模式的原理和实现,包括如何创建代理对象和实现`InvocationHandler`。 - `动态代理详解.docx`则可能深入讨论了Java动态代理的细节,包括实际应用场景和常见问题。...
以下是一个简单的动态代理模式示例: ```java public interface Service { void doSomething(); } public class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy...
Java的动态代理是一种强大的设计模式,它允许在运行时创建具有特定行为的代理对象,这些对象可以代替原对象执行某些任务。动态代理机制是Java语言提供的一种反射特性,主要用于实现AOP(面向切面编程)或者对现有...
以下是一个简单的静态代理模式示例: 1. 定义接口: ```java public interface Service { void doSomething(); } ``` 2. 实现目标对象: ```java public class RealService implements Service { @Override ...
在这个实例中,我们将深入探讨Java动态代理的核心概念,以及如何利用它来实现拦截器模式。 首先,我们需要了解Java动态代理的基本原理。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....
Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...
Java动态代理模式是一种设计模式,它可以为其他对象提供一种代理以控制对这个对象的访问。在Java中,动态代理是利用反射机制实现的,可以在运行时动态生成代理类和对象。它主要应用于需要控制对象访问、提供额外功能...
Java代理模式是一种设计模式,它在面向对象编程中扮演着重要的角色,主要目的是为了在不修改原有对象的基础上,为对象添加额外的功能或者控制对对象的访问。代理模式的核心思想是通过代理类来间接调用目标类的方法,...
动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...
在这个"代理模式的使用示例程序"中,我们很可能会看到如何通过拦截器(Interceptor)来实现代理。 首先,让我们理解代理模式的基本结构。在代理模式中,有三个主要的角色:原始对象(Real Subject)、代理对象...