1. 程式人生 > >設計模式-代理模式(Proxy)

設計模式-代理模式(Proxy)

代理模式是構造型模式的一種,它可以為其他物件提供一種代理以控制對這個物件的訪問。

所為代理,是具有與代理元(被代理的物件)(RealSubject)具有相同的介面(Subject)的類。

角色和職責:

1.抽象主題(subject)-Subject:

  抽象主題公共介面

2.具體主題(RealSubject)-RealSubject:

    代理角色所代表的真實物件

3.代理主題(Proxy)-StaticProxySubject、DynamicProxySubject:

    含有對真實主題角色的引用,代理角色通常在將客戶端呼叫傳遞給真實主題之前或者之後執行某些操作,而不是單純返回真實的物件

 

代理模式分為靜態代理和動態代理

UML圖:

具體程式碼:

/**
 * 賣書
 */
public interface Subject {
    void doAction();//賣書
}
/**
 * 出版社賣書
 */
public class RealSubject implements Subject{
    @Override
    public void doAction() {
        System.out.println("賣書");
    }
}
/**
 * 靜態代理:噹噹網賣書
 */
public class
StaticProxySubject implements Subject{ private RealSubject realSubject; public StaticProxySubject(){ this.realSubject = new RealSubject();//出版社 } @Override public void doAction() { this.discount();//打折 this.realSubject.doAction();//賣書 this.give();//送禮品 }
/** * 打折 */ private void discount(){ System.out.println("打折"); } /** * 送禮品 */ private void give(){ System.out.println("送禮品"); } }
/**
 * 動態代理
 */
public class DynamicProxySubject implements InvocationHandler {
    private RealSubject realSubject;

    public DynamicProxySubject(){
        this.realSubject = new RealSubject();
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        this.discount();//打折
        Object obj = method.invoke(realSubject,args);
        this.give();//送禮品
        return obj;
    }

    /**
     * 打折
     */
    private void discount(){
        System.out.println("打折");
    }

    /**
     * 送禮品
     */
    private void give(){
        System.out.println("送禮品");
    }
}
import java.lang.reflect.Proxy;

public class Main {
    public static void main(String[] args) {
        //靜態代理
        StaticProxySubject staticProxySubject = new StaticProxySubject();
        staticProxySubject.doAction();//賣書
        System.out.println("----------------------------");

        //動態代理
        DynamicProxySubject dynamicProxySubject = new DynamicProxySubject();
        Subject subject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[]{Subject.class},dynamicProxySubject);
        subject.doAction();//賣書
    }
}

 

 

 專案原始碼:https://github.com/qjm201000/design_pattern_proxy.git