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:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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();

    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章