swift設計模式學習
阿新 • • 發佈:2018-12-25
移動端訪問不佳,請訪問我的個人部落格
設計模式學習的demo地址,歡迎大家學習交流
代理模式
代理模式為其他物件提供一種代理以控制對這個物件的訪問,在某些情況下,一個物件不適合或者不能直接引用另一個物件,而代理物件可以在客戶端和目標物件之間起到中介的作用。
代理模式的組成
- 抽象角色:通過介面或抽象類宣告真實角色實現的業務方法。
- 代理角色:實現抽象角色,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象方法,並可以附加自己的操作。
- 真實角色:實現抽象角色,定義真實角色所要實現的業務邏輯,供代理角色呼叫。
代理模式的基本實現
上圖是最基本的代理模式的結構圖,下面將用Swift
// 定義一個介面
protocol Subject {
func request()
}
class RealSubject: Subject {
func request() {
print("真實的請求")
}
}
class Proxy: Subject {
// 真實的物件
var realSubject: RealSubject?
func request() {
realSubject?.request()
}
}
以上是一個最基本的代理模式的構成,這樣可以用Proxy
RealSubject
,從而對客戶端隱藏真實的物件。
代理模式解決實際問題(快遞與淘寶賣家的關係)
在生活中很多地方存在著代理模式,比如淘寶賣家與快遞的問題,我們買東西需要淘寶賣家進行配送,但是其實他們並沒有配送的功能,實際上是由快遞公司進行的配送,淘寶就相當於快遞公司的代理,買家也不用關心淘寶賣家是怎麼送貨過來的,下面是大概的實現方式:
// 定義一個配送的介面
protocol Deliver {
var goodsName: String { get }
func deliverGoods()
}
// 快遞公司繼承配送的介面
class Express: Deliver {
var goodsName: String
init(goodsName: String) {
self.goodsName = goodsName
}
func deliverGoods() {
print("由順豐快遞配送\(goodsName)")
}
}
// 淘寶賣家也繼承配送的介面
class Taobao: Deliver {
// 實際上是由快遞公司配送
var express: Express
var goodsName: String
init(goodsName: String) {
express = Express(goodsName: goodsName)
self.goodsName = goodsName
print("買了一個\(goodsName)")
}
func deliverGoods() {
express.deliverGoods()
}
}
下面我們使用一下以上程式碼看看:
let tb = Taobao(goodsName: "電腦")
tb.deliverGoods()
下面是列印結果:
買了一個電腦
由順豐快遞配送電腦
代理模式的優點
- 職責清晰,真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理完成一件完成事務,附帶的結果就是程式設計簡潔清晰。
- 代理物件可以在客戶端和目標物件之間起到中介的作用,這樣起到了中介的作用和保護了目標物件的作用。
- 高擴充套件性
以上是我對於代理模式的理解,如果有不對的地方歡迎大家交流,最後謝謝大家的閱讀~~