您的位置:首页 > 其它

设计模式之代理模式(Proxy)

2014-08-20 11:29 295 查看

1、定义

代理模式是一个使用率非常高的模式,它为其他对象提供一种代理以控制对这个对象的访问。

2、通用类图





subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求

RelSubject具体主题角色:也叫做被委托角色、被代理角色。是业务逻辑的具体执行者。

Proxy代理主题角色:也叫委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。

3、通用源代码

普通代理:

package proxy;
/**
*抽象主题类
* 2014-8-20上午10:24:17-limiracle
*/
public interface Subject {
//定义一个方法
public void request();
}

package proxy;
/**
*真实主题类
* 2014-8-20上午10:25:15-limiracle
*/
public class RealSubject implements Subject{
//实现方法
public void request(){
System.out.println("处理中....");
}
}

package proxy;

public class Proxy implements Subject{
//要代理哪个实现类
private Subject subject=null;
//默认被代理者
public Proxy(Subject subject){
this.subject=subject;
}
//通过构造函数传递代理者
public Proxy(Object...objects ){
}
//实现接口中定义的方法
public void request(){
this.before();
this.subject.request();
this.after();
}
//预处理
private void before(){
System.out.println("开始代理...");
}
//善后处理
private void after(){
System.out.println("结束代理...");
}
}

package proxy;

public class Main {
public static void main(String args[]){
Proxy proxy=new Proxy(new RealSubject());
proxy.request();
}
}

动态代理源码


package proxy.dynamic;
/**
*抽象主题类
* 2014-8-20上午10:24:17-limiracle
*/
public interface Subject {
//定义一个方法
public void request();
}

package proxy.dynamic;
/**
*真实主题类
* 2014-8-20上午10:25:15-limiracle
*/
public class RealSubject implements Subject{
//实现方法
public void request(){
System.out.println("处理中....");
}
}

package proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler{
private Object target=null;
public MyInvocationHandler(Object obj){
this.target=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return method.invoke(this.target, args);
}

}

package proxy.dynamic;

public interface IAdvice {
//通知只有一个方法,
public void exec();
}

package proxy.dynamic;

public class BeforeAdvice implements IAdvice {
public void exec(){
System.out.println("我是前置通知,我被执行了!");
}
}

package proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class DynamicProxy<T> {
public static <T> T newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h){
//寻找joinpoint连接点,AOP框架使用元数据定义
if(true){
//执行一个前置通知
(new BeforeAdvice()).exec();
}
//执行目标,并返回结果
return (T)Proxy.newProxyInstance(loader, interfaces, h);
}
}

package proxy.dynamic;

import java.lang.reflect.InvocationHandler;

public class Main {

/**
* @param args
*/
public static void main(String[] args) {
//定义一个主题
Subject subject=new RealSubject();
//定义一个handler
InvocationHandler handler=new MyInvocationHandler(subject);
//定义主题的代理
Subject proxy=DynamicProxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(),handler);
//代理行为
proxy.request();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: