设计模式之代理模式

1、代理模式
所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
举一个例子,生活中乘坐出租车。
接口

public interface traffic {
    public   void traffic();

}

真实类

//真实类
public class real implements traffic{
    public void traffic() {
        System.out.println("乘坐出租车");

    }

}

代理类

//代理类
public class proxy implements traffic{
    private real rl=new real();
    public void traffic(){
        doBefore();
        rl.traffic();
        doAfter();
    }
    public void doBefore(){
        System.out.println("前置处理");
    }
    public void doAfter(){
        System.out.println("后置处理");
    }
}

客户端测试类

public class Client {
    public static void main(String[] args){
       traffic tr=new proxy();
       tr.traffic();
    }
}

代理模式很容易理解,就是在两个角色之间在加入了个中介,生活中租房子的租户找中介租房子也是这样的方式。
2、动态代理
但是,在java中还有个动态代理的实现方式。
实现方法类似,只不过是把代理角色的生成交给了java类。
代理角色

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

public class MyInvocationHandler implements InvocationHandler {  

    // 目标对象   
    private Object target;  

    /** 
     * 构造方法 
     * @param target 目标对象  
     */  
    public MyInvocationHandler(Object target) {  
        super();  
        this.target = target;  
    }  



    /** 
     * 执行目标对象的方法 
     */  
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  

        // 在目标对象的方法执行之前简单的打印一下  
        System.out.println("------------------before------------------");  

        // 执行目标对象的方法  
        Object result = method.invoke(target, args);  

        // 在目标对象的方法执行之后简单的打印一下  
        System.out.println("-------------------after------------------");  

        return result;  
    }  

    /** 
     * 获取目标对象的代理对象 
     * @return 代理对象 
     */  
    public Object getProxy() {  
        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),   
                target.getClass().getInterfaces(), this);  
    }  
}  

目标角色接口

/** 
 * 目标对象实现的接口,用JDK来生成代理对象一定要实现一个接口 
 * @author zyb 
 * @since 2012-8-9 
 * 
 */  
public interface UserService {  

    /** 
     * 目标方法  
     */  
    public abstract void add();  

}  

目标角色的实现

/** 
 * 目标对象 
 * @author zyb 
 * @since 2012-8-9 
 * 
 */  
public class UserServiceImpl implements UserService {  

    /* (non-Javadoc) 
     * @see dynamic.proxy.UserService#add() 
     */  
    public void add() {  
        System.out.println("--------------------add---------------");  
    }  
}  

客户端测试

public class ProxyTest {  


    public static void main(String[] args){  
        // 实例化目标对象  
        UserService userService = new UserServiceImpl();  

        // 实例化InvocationHandler  
        MyInvocationHandler invocationHandler = new MyInvocationHandler(userService);  

        // 根据目标对象生成代理对象  
        UserService proxy = (UserService) invocationHandler.getProxy();  

        // 调用代理对象的方法  
        proxy.add();  

    }  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值