代理模式: 為其他對象提供一種代理以控制對這個對象的訪問, 在某些情況下, 一個對象不適合或著不能直接引用另一個對象, 而代理對象可以在客戶端和目標對象中間起到中介作用
模式中包含的對象及其職責
Subject: 抽象主題主角, 抽象主題類可以是抽象類, 也可以是介面, 是一個最普通的業務類型定義, 無特殊要求
RealSubject: 具體主題角色, 也叫做委託角色, 被代理角色, 是業務邏輯的具體執行者
Proxy: 代理主題角色, 也叫委託類, 代理類, 它被所有抽象主題類定義的方法給具體主題角色實現, 並且在具體主題角色處理完畢前後做預處理和善後工作(最簡單的比如打印日誌)
對於subject來說, 如果傳過來的是RealSubject, 就叫RealSubject做事, 如果是Proxy就叫Proxy做事
例子:
我們有一個介面, IMacSeller, 它有一個方法buy
我們造一個類別USAMacSeller 作為真正商品來源的賣商, 實現買的功能(reasubjet)
我們再造一個類別HongKongMacSeller, 作為代理商(Proxy)當我們購買的時候, 它會將USAMacSeller 叫出來實現購買
相當於說, 他去美國買這件事情已經看不到, 也就是香港這個代理商幫我們做了去美國買這一件事情, 今天我們換成和美國買, 也是沒有問題, 今天這個代理這一件事情, 對於我們客戶端是不可見的, 也是可以任意替換的, 今天要去泰國, 或是其他地方買, 對我們而言也是一樣的, 我們只知道我們買到了macbook, 但是代理商從哪來的就是不可見的
應用場景:
現實世界中, 秘書就相當於一個代理, 老闆開會, 通知員工開會時間, 布置會場, 會後整理會場等等工作事情就可以叫給秘書來做, 老闆只需要開會就行, 並不需要親自做那些事, 同理, 我們程式設計中可以使用代理模式, 將一系列無關邏輯組合再一起進行解耦, 比如業務代碼中的日誌代碼, 就可以在代理中進行, Spring的AOP就是典型的動態代理應用
https://www.youtube.com/watch?v=cA-vt0Nf1nQ&list=PLGmd9-PCMLhb16ZxeSy00qUsBazXgJyfM&index=15
https://github.com/iw5420/geroge-design-pattern
沒有留言:
張貼留言