目录
策略模式
当业务需求涉及到很多的分支逻辑时,过多的if-else或者过多的switch代码显得很不简洁,而且当我们修改某一分支逻辑时,要改动的很多,比如现在某一分支不要了,就要把这个if条件删除掉,这样是很不好的,这个时候,我们想到了策略模式,替换掉过多的if-else或者switch语句。
策略这个词应该怎么理解,打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。 再比如我们去逛商场,商场现在正在搞活动,有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换的,比如针对同一件商品,今天打八折、明天满100减30,这些策略间是可以互换的。
策略模式(Strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。
实际应用
容错恢复机制
容错恢复机制是应用程序开发中非常常见的功能。那么什么是容错恢复呢?
简单点说就是:程序运行的时候,正常情况下应该按照某种方式来做,如果按照某种方式来做发生错误的话,系统并不会崩溃,也不会就此不能继续向下运行了,而是有容忍出错的能力,不但能容忍程序运行出现错误,还提供出现错误后的备用方案,也就是恢复机制,来代替正常执行的功能,使程序继续向下运行。
举个实际点的例子吧,比如在一个系统中,所有对系统的操作都要有日志记录,而且这个日志还需要有管理界面,这种情况下通常会把日志记录在数据库里面,方便后续的管理,但是在记录日志到数据库的时候,可能会发生错误,比如暂时连不上数据库了,那就先记录在文件里面,然后在合适的时候把文件中的记录再转录到数据库中。
对于这样的功能的设计,就可以采用策略模式,把日志记录到数据库和日志记录到文件当作两种记录日志的策略,然后在运行期间根据需要进行动态的切换。
策略模式实现
一、Context
Context.swift
class Context: NSObject {
private var strategy : Strategy = DBStrategy()
func saveLog(log:String) {
do {
try strategy.writeData(data: log)
} catch {
print(error)
strategy = FileStrategy()
do {
try strategy.writeData(data: log)
//有机会再写入,数据库
} catch {
print(error)
}
}
}
}
二、Strategy
Strategy.swift
protocol Strategy {
func writeData(data:String) throws
}
DBStrategy.swift
struct DBError: Error {
var msg:String
var code:Int
}
class DBStrategy: Strategy {
func writeData(data: String) throws {
guard data.count < 18 else {
throw DBError(msg: "文本内容过长",code:300)
}
print("write data to DB ...")
}
}
FileStrategy.swift
struct FileError : Error {
var msg:String
var code:Int
}
class FileStrategy: Strategy {
func writeData(data: String) throws {
print("write data to file ...")
}
}
行者常至,为者常成!