1. 程式人生 > 實用技巧 >Spring-10-AOP先驗知識之代理模式

Spring-10-AOP先驗知識之代理模式

10. 代理模式

在學AOP之前,先理解代理模式!

為什麼要學習代理模式?

因為這就是Spring AOP的底層!

【SpringAOP和SpringMVC】

代理模式的分類:

  • 靜態代理
  • 動態代理

10.1 靜態代理

角色分析:

  • 抽象角色:一般會使用介面和抽象類來解決
  • 真實角色:被代理的角色
  • 代理角色:代理真實角色,代理真實角色後,一般會做一些附屬操作
  • 客戶:訪問代理物件的人

程式碼演示步驟:

  1. 介面

    //租房案例
    public interface Rent {
        public void rent();
    }
    
  2. 真實角色

    //房東
    public class Host implements Rent{
    
        public void rent() {
            System.out.println("房東要出租房子!");
        }
    }
    
  3. 代理角色

    public class Proxy implements Rent{
        private Host host;
    
        public Proxy() {
        }
    
        public Proxy(Host host) {
            this.host = host;
        }
    
        public void rent() {
            seeHouse();
            host.rent();
            hetong();
            fare();
        }
        //看房
        public void seeHouse(){
            System.out.println("中介帶你看房!");
        }
        //收中介費
        public void fare(){
            System.out.println("收中介費!");
        }
        //籤合同
        public void hetong(){
            System.out.println("籤租賃合同!");
        }
    }
    
  4. 客戶端訪問代理角色

public class Client {
    public static void main(String[] args) {
        Host host = new Host();

        //代理,中介一般會有一些附屬操作
        Proxy proxy = new Proxy(host);

        //不用直接面對房東,直接找中介租房即可
        proxy.rent();
    }
}

代理模式的好處

  • 可以使真實角色的操作更加純粹!不用去關注公共業務!
  • 公共業務交給代理角色!實現了業務的分工!
  • 公共業務發生擴充套件的時候,方便集中管理!

缺點:

  • 一個真實角色會產生一個代理角色;開發效率會變低。

10.2 加深理解

聊聊AOP

10.3 動態代理

  • 動態代理和靜態代理角色一樣
  • 動態代理的代理類是動態生成的,不是直接寫好的!
  • 動態代理也分類兩大類:
    • 基於介面的動態代理【我們這裡使用】
      • JDK動態代理
    • 基於類的動態代理
      • cglib
    • java位元組碼實現:javasist

需要了解兩個類:

  • Proxy:代理;
  • InvocationHandler:呼叫處理程式;

動態代理的好處:

  • 可以使真實角色的操作更加純粹!不用去關注公共業務!
  • 公共業務交給代理角色!實現了業務的分工!
  • 公共業務發生擴充套件的時候,方便集中管理!
  • 一個動態代理類代理的是一個介面,一般就是對應的一類業務!
  • 一個動態代理類可以代理多個類,只要實現了同一個介面即可!