1. 程式人生 > 其它 >設計模式 靜態代理模式

設計模式 靜態代理模式

1 靜態代理模式

1.1 定義

簡單來說就是建立一個代理物件(Proxy),只有代理物件能呼叫目標物件(RealSubject),同時Proxy也實現了目標物件RealSubject的介面(Subject),這就能實現多型。

代理模式的核心是,客戶端(Client)要想訪問目標物件(RealSubject)的方法時,只能通過代理物件(Proxy)實現。

可以看到代理物件相比目標物件還多了preRequest和afterRequest,這些自定義的方法就能實現對目標物件的方法的增強,這也是springAOP的原理

1.2 手動實現

為了方便學習,程式碼都寫在一個檔案下

public class ProxyPattern {
    public static void main(String[] args) {
        //例項化目標物件
        RealSubject realSubject = new RealSubject();
        //例項化代理物件
        RealSubjectProxy realSubjectProxy = new RealSubjectProxy(realSubject);
        //使用代理物件的方法
        realSubjectProxy.doWork();
    }
}

/**
 * 統一介面
 */
interface Subject{
    void doWork();
}

/**
 * 目標物件
 */
class RealSubject implements Subject{

    @Override
    public void doWork() {
        System.out.println("做了某件事");
    }
}

/**
 * 代理物件
 */
class RealSubjectProxy implements Subject{

    private RealSubject subject;

    public RealSubjectProxy(RealSubject subject){
        this.subject = subject;
    }

    /**
     * 自定義方法1
     */
    public void connection(){
        System.out.println("建立連線");
    }

    /**
     * 自定義方法2
     */
    public void log(){
        System.out.println("日誌記錄");
    }

    /**
     * 對目標物件的方法進行增強
     */
    @Override
    public void doWork() {
        connection();
        subject.doWork();
        log();
    }
}

5.3 和裝飾器模式的區別

代理模式強調代理類對真正辦事兒的類的許可權控制能力,裝飾器強調對舊物件而不是舊類的功能擴充套件