ITKeyword,专注技术干货聚合推荐

注册 | 登录

java设计模式(结构型)之代理模式

Tianxing10 分享于 2014-03-17

推荐:结构型模式之代理模式(Proxy 与 JDK动态代理)

代理模式,涉及到两个角色:代理者 与 委托者,即 Proxy 与Delegator,代理者不能真正做事,真正做事的只有委托者自己可以,代理者只是辅助作用而绝对不能(通常

2019阿里云全部产品优惠券(新购或升级都可以使用,强烈推荐)
领取地址https://promotion.aliyun.com/ntms/yunparter/invite.html

第0章:简介

代理模式定义:为其他对象提供一种代理以控制对这个对象的访问

代理模式本质:控制对象访问

参考:http://chjavach.iteye.com/blog/1630401研磨设计模式(书籍),大话设计模式(书籍)

模式图:

待补充


第1章:实践

第0节:静态代理模式(自定义)

(1)接口(Intf.java)

package com.mcc.core.designPattern.structure.proxy.staticProxy;

/**
 * 接口,被代理和代理对象的公共接口
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-12  下午10:20
 */
public interface Intf {

    public void someMethod();
}

(2)实现类(IntfImpl.java)

package com.mcc.core.designPattern.structure.proxy.staticProxy;

/**
 * 实现类,被代理的对象
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-12  下午10:22
 */
public class IntfImpl implements Intf {
    @Override
    public void someMethod() {
        System.out.println("被代理对象的方法");
    }
}

(3)代理对象(StaticProxy.java)

package com.mcc.core.designPattern.structure.proxy.staticProxy;

/**
 * 代理对象,同样实现接口,本例是静态代理
 *
 * 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问
 * 代理模式的本质:控制对象访问
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-12  下午10:23
 */
public class StaticProxy implements Intf {

    //持有被代理的具体对象
    private Intf intf;

    /**
     * 构造器,传入被代理的具体目标对象
     * @param intf
     */
    public StaticProxy(Intf intf){
        this.intf = intf;
    }

    /**
     * 代理方法
     */
    @Override
    public void someMethod() {
        //这里是调用前业务逻辑
        System.out.println("调用被代理对象方法前的操作");
        //调用被代理对象的方法
        intf.someMethod();
        //这里是调用后业务逻辑
        System.out.println("调用被代理对象方法后的操作");
    }
}

(4)客户端测试(Client.java)

推荐:Java设计模式-代理模式之静态代理

Java设计模式-代理模式之静态代理 概念 为另一个对象提供一个替身或占位符以提供对这个对象的访问,使用代理模式创建代表对象,让代表对象控制某对象的访问,被

package com.mcc.core.designPattern.structure.proxy.staticProxy;

/**
 * 客户端测试
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-12  下午10:30
 */
public class Client {

    public static void main(String args[]){

        System.out.println("不通过代理调用:");
        //调用被代理对象(目标对象)方法
        Intf intf1 = new IntfImpl();
        intf1.someMethod();

        System.out.println("通过代理调用:");
        //通过代理对象使用被代理对象方法,加入其他操作
        Intf intf2 = new StaticProxy(intf1);
        intf2.someMethod();
    }
}

第1节:动态代理模式(java自带)

(1)接口(Intf.java)

package com.mcc.core.designPattern.structure.proxy.dynamicProxy;

/**
 * 接口,被代理对象的接口
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-12  下午10:20
 */
public interface Intf {

    public void someMethod();
}

(2)实现类(IntfImpl.java)

package com.mcc.core.designPattern.structure.proxy.dynamicProxy;


/**
 * 实现类,被代理的对象
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-12  下午10:22
 */
public class IntfImpl implements Intf {
    @Override
    public void someMethod() {
        System.out.println("被代理对象的方法");
    }
}

(3)代理对象(DynamicProxy.java)

package com.mcc.core.designPattern.structure.proxy.dynamicProxy;

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

/**
 * 代理对象,使用java中的动态代理
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-12  下午10:41
 */
public class DynamicProxy implements InvocationHandler{

    //持有被代理的具体对象
    private Intf intf;

    /**
     * 获取绑定好代理对象和被代理的目标对象后的目标对象的接口
     * @param intf
     */
    public Intf getProxyInterface(Intf intf){
        this.intf = intf;
        //把目标对象和动态代理关联起来
        Intf result = (Intf)Proxy.newProxyInstance(
                intf.getClass().getClassLoader(),
                intf.getClass().getInterfaces(),
                this);
        return result;
    }


    /**
     * 复写java的调用方法
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //这里是调用前业务逻辑
        System.out.println("调用被代理对象方法前的操作");
        //调用被代理对象的方法
        Object obj = method.invoke(intf,args);
        //这里是调用后业务逻辑
        System.out.println("调用被代理对象方法后的操作");

        return obj;
    }
}

(4)客户端测试(Client.java)

package com.mcc.core.designPattern.structure.proxy.dynamicProxy;

/**
 * 客户端测试
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-12  下午10:49
 */
public class Client {

    public static void main(String args[]){

        System.out.println("不通过代理调用:");
        //调用被代理对象(目标对象)方法
        Intf intf1 = new IntfImpl();
        intf1.someMethod();

        System.out.println("通过代理调用:");
        //通过代理对象使用被代理对象方法,加入其他操作
        DynamicProxy DynamicProxy = new DynamicProxy();
        //通过代理对象获取目标对象
        Intf intf2 = DynamicProxy.getProxyInterface(intf1);
        intf2.someMethod();

    }
}



推荐:Java设计模式之结构型模式

结构型设计模式是从程序的结构上解决模块之间的耦合问题。包括以下七种模式: 适配器模式:可以将类的一个借口匹配另一个接口 组合模式:对象的组合 代理模式:

第0章:简介 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问 代理模式本质:控制对象访问 参考:http://chjavach.iteye.com/blog/1630401 ,研磨设计模式(书籍),大话设计模式

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。