JAVA代理模式的一个例子
//代理角色:
public class ProxySubject extends Subject{
private RealSubject realSubject; //以真实角色作为代理角色的属性
public ProxySubject(){
}
public void request(){ //该方法封装了真实对象的request方法
preRequest();
if( realSubject == null ){
realSubject = new RealSubject();
}
realSubject.request(); //此处执行真实对象的request方法
postRequest();
}
private void preRequest(){
//something you want to do before requesting
}
private void postRequest(){
//something you want to do after requesting
}
public static void main(String[] args) {
//客户端调用:
Subject sub=new ProxySubject();
sub.request();
}
}
//抽象角色:
abstract class Subject{
abstract public void request();
}
//真实角色:实现了Subject的request()方法。
class RealSubject extends Subject{
public RealSubject(){
}
public void request(){
System.out.println("From real subject.");
}
}
这里是UML图
JDK里面也有一套现在的代理机制.
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Client{
static public void main(String[] args) throws Throwable {
// 被代理的对象(RealSubject)可以在运行时动态改变,
// 需要控制的接口(Subject接口)可以在运行时改变,
// 控制的方式(DynamicSubject类)也可以动态改变,
// 从而实现了非常灵活的动态代理关系
RealSubject2 rs = new RealSubject2(); //在这里指定被代理类
InvocationHandler ds = new DynamicSubject(rs); //初始化代理类
Class cls = rs.getClass();
//以下是分解步骤
/*
Class c = Proxy.getProxyClass(cls.getClassLoader(),cls.getInterfaces());
Constructor ct=c.getConstructor(new Class[]{InvocationHandler.class});
Subject subject =(Subject) ct.newInstance(new Object[]{ds});
*/
//以下是一次性生成
Subject2 subject = (Subject2) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),ds);
subject.request();
}
}
class DynamicSubject implements InvocationHandler{
private Object sub;
public DynamicSubject(Object sub){
this.sub = sub;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before calling " + method);
method.invoke(sub,args); //sub是实际的被代理对象,args是被代理对象方法的参数
System.out.println("after calling " + method);
return null;
}
}
//抽象角色(之前是抽象类,此处应改为接口):
interface Subject2{
public void request();
}
//具体角色RealSubject:实现了Subject接口的request()方法。
class RealSubject2 implements Subject2{
public RealSubject2(){
}
public void request(){
System.out.println("From real subject.");
}
}
以后有用上了研究一下它的实现机制,现在暂时留个印象
- 大小: 24.7 KB
分享到:
相关推荐
java代理模式
自己总结的代理模式和Java中的动态代理模式,有源码
Java 代理模式 简单实现,这是用Java实现的Java代理模式,包括动态代理, 可以运行
Java代理模式 事例很生动,非常容易理解,推荐给大家。
java代理模式和动态代理
JAVA设计模式之代理模式实例
Java代理模式模板代码,包含动态代理与静态代理。 静态代理使用了传统的代理类来代理,动态代理中使用了jdk的反射原理进行代理
16-Java代理模式的学习笔记1
对java代理模式有个详细而深入的讲解,从jdk api的角度来讲解的。。。
用java实现代理模式,使用房屋中介的现实例子进行代理模式的说明
Java代理模式.pdf
浅析JAVA代理模式.pdf
Java代理模式参照.pdf
分析Java代理模式的使用方式,和JDK内部动态代理的实现机制,演示如何自己去实现一个动态代理模式,有助于初学者对Java代理模式的理解和运用。
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。
编程语言Java代理模式.pdf