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

第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)

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

    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值