码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-20 12:10:42      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   java   使用   io   数据   

1、定义

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

2、通用类图

bubuko.com,布布扣

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();
    }

}

设计模式之代理模式(Proxy),布布扣,bubuko.com

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

标签:style   blog   http   color   java   使用   io   数据   

原文地址:http://www.cnblogs.com/limiracle/p/3924180.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!