設計模式專題-策略模式

AndreaArlex同志發表於2019-04-19

image.png

很久沒寫文章了,今天看到了一個感覺很棒的設計模式,所以想把它記錄下來,一起分享給大家。這個模式叫策略模式。 ####廢話就不多說了,我們先看看它的定義:

策略模式作為一種軟體設計模式指物件有某個行為,但是在不同的場景中,該行為有不同的實現演算法。比如每個人都要“交個人所得稅”,但是“在美國交個人所得稅”和“在中國交個人所得稅”就有不同的算稅方法。(以上是百度百科給出的定義)

####應用場景:

  • 做同樣的事情,但是又不同的方法 當你需要通過不同的方式在程式碼中做同樣的事情時,你就可以使用這種設計模式了。(最常用)

  • 替代if/else程式碼塊 如果你覺得你的類有很多的if/else,這就表明這個類的職責太臃腫,可以使用這種模式來進行拆分。

####例子: 這裡我舉出一個例子來說明一下這個模式: 比如你有個需求,需要列印文案,列印他的大寫、小寫、首字母大寫。可能一般的人就會這樣寫:

struct Logger {

    enum LogStyle {
        case lowercase
        case uppercase
        case capitalized
    }

    let style: LogStyle

    func log(_ message: String) {
        switch style {
        case .lowercase:
            print(message.lowercased())
        case .uppercase:
            print(message.uppercased())
        case .capitalized:
            print(message.capitalized)
        }
    }
}
複製程式碼

這樣寫,看起來也沒啥問題,好像也很簡潔是吧? 但是,這個時候,如果我讓你再增加10中列印型別呢?50種呢?100種呢?你是不是要一直case100中情況?而且,所有程式碼都雜在一個類裡面了?

那麼,策略模式就可以很好的解決這個問題了。

image.png

策略模式我們有3塊:

  • WAHT: 定義我們要封裝的操作協議。
  • WHO:包含符合策略的物件的物件。
  • HOW :戰略的具體實施。每種實施都不同。
///WHAT
protocol LoggerStrategy {
    
    func log(message: String)
}

///WHO
struct Logger {
    let strategy:LoggerStrategy
    
    init(_strategy:LoggerStrategy) {
        strategy = _strategy
    }
    
    func log(message: String) {
        
        strategy.log(message: message)
    }
    
}

///HOW
struct LowercaseStrategy:LoggerStrategy {
    func log(message: String) {
        print(message.lowercased())
    }
}

struct UppercaseStrategy:LoggerStrategy {
    func log(message: String) {
        print(message.uppercased())
    }
}

struct CapitalizedStrategy:LoggerStrategy {
    func log(message: String) {
        print(message.capitalized)
    }
}

///use
var logger = Logger(_strategy: CapitalizedStrategy())
        logger.log(message: "my first strategy")
        
        logger = Logger(_strategy: LowercaseStrategy())
        logger.log(message: "my first strategy")
        
        logger = Logger(_strategy: UppercaseStrategy())
        logger.log(message: "my first strategy")
複製程式碼

結果:

image.png

這樣,無論我們的需求情況如何增加,你增加100種,我們都應付,而且,程式碼不需要雜在一起了,而且,可擴充套件性也很高,需要用加用,不需要的,直接刪除,增加也行。

相關文章