設計模式之代理模式

  1. 什麼是代理模式(Proxy)

    • 爲其他對象提供一種代理以控制對這個對象的訪問
  2. 代理模式的幾個角色

    • Subject抽象主題角色,可以是一個抽象類或者接口,定義通用的業務
    • RealSubject具體主題角色,被代理角色,是業務具體的執行者
    • Proxy代理主題角色,也是委託類、代理類,負責對真實對象的應用,可以做預處理或者善後處理
  3. 示例代碼(示例中包括基本的代理模式、強制代理、動態代理)
    • 基本的代理模式
package com.pattern.proxy.base;

/**
 * 接口類,所有的具體Subject都要實現這個接口
 * @author yjzhou
 */
public interface Subject {
    public void request();
}
package com.pattern.proxy.base;

/**
 * 具體的subject類,實現完成Subject接口中的方法
 * @author yjzhou
 */
public class RealSubject implements Subject{

    @Override
    public void request() {
        System.out.println("具體主題類執行request----");
    }

}
package com.pattern.proxy.base;

/**
 * 代理類,代理處理Subject類的request的方法
 * @author yjzhou
 */
public class ProxySubject implements Subject{

    private Subject subject;

    /**
     * 通過構造函數傳遞被代理者
     * @param subject
     */
    public ProxySubject(Subject subject) {
        this.subject = subject;
    }

    @Override
    public void request() {
        before();
        subject.request();
        after();
    }

    /**
     * 預處理
     */
    private void before(){
        System.out.println("代理執行前的預處理-----");
    }

    /**
     * 後處理
     */
    private void after(){
        System.out.println("代理執行完成後的處理-----");
    }

}
package com.pattern.proxy.base;

/**
 * 基本的代理模式測試類
 * @author yjzhou
 */
public class TestProxy {
    public static void main(String[] args) {
        ProxySubject proxy = new ProxySubject(new RealSubject());
        proxy.request();

        RealSubject realSubject = new RealSubject();
        realSubject.request();
    }
}
  • 強制代理
package com.pattern.proxy.force;

public interface Subject {
    public void request();
    public Subject getProxy();
}
package com.pattern.proxy.force;

public class RealSubject implements Subject {

    private ProxyForce proxy = null;

    public RealSubject() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void request() {
        if (isProxy()) {
            System.out.println("具體主題執行reques------");
        } else {
            System.out.println("請使用指定代理訪問----");
        }
    }

    @Override
    public Subject getProxy() {
        this.proxy = new ProxyForce(this);
        return this.proxy;
    }

    private boolean isProxy() {
        if (null == this.proxy) {
            return false;
        } else {
            return true;
        }
    }

}
package com.pattern.proxy.force;

public class ProxyForce implements Subject{

    private Subject subject;

    public ProxyForce(Subject subject) {
        this.subject = subject;
    }

    @Override
    public void request() {
        before();
        subject.request();
        after();
    }

    @Override
    public Subject getProxy() {
        return this;
    }

    /**
     * 預處理
     */
    private void before(){
        System.out.println("代理執行前的預處理-----");
    }

    /**
     * 後處理
     */
    private void after(){
        System.out.println("代理執行完成後的處理-----");
    }

}
package com.pattern.proxy.force;

public class TestProxyForce {

    public static void main(String[] args) {
        //需要代理才能操作
        RealSubject realSubject = new RealSubject();
        realSubject.request();

        System.out.println("---------------------------------------");

        //不是指定的代理,同樣無法操作
        ProxyForce proxyForce = new ProxyForce(realSubject);
        proxyForce.request();

        System.out.println("---------------------------------------");

        //獲得代理正確操作
        Subject proxy = realSubject.getProxy();
        proxy.request();

        System.out.println("---------------------------------------");
    }

}
  • 動態代理
package com.pattern.proxy.dynamic;

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

public class DyProxyHandler implements InvocationHandler{

    private Object obj = null;

    public DyProxyHandler(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(obj, args);
        return result;
    }

}
package com.pattern.proxy.dynamic;

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

import com.pattern.proxy.base.RealSubject;
import com.pattern.proxy.base.Subject;

public class TestDyProxy {
    public static void main(String[] args) {
        Subject subject = new RealSubject();
        InvocationHandler handler = new DyProxyHandler(subject);
        Class<?> cls = subject.getClass();
        Subject proxySubject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces() , handler);
        proxySubject.request();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章