1. 程式人生 > >swift設計模式學習

swift設計模式學習

移動端訪問不佳,請訪問我的個人部落格

設計模式學習的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()

下面是列印結果:

買了一個電腦
由順豐快遞配送電腦

代理模式的優點

  1. 職責清晰,真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理完成一件完成事務,附帶的結果就是程式設計簡潔清晰。
  2. 代理物件可以在客戶端和目標物件之間起到中介的作用,這樣起到了中介的作用和保護了目標物件的作用。
  3. 高擴充套件性

以上是我對於代理模式的理解,如果有不對的地方歡迎大家交流,最後謝謝大家的閱讀~~