策略模式属于对象的行为模式,针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化.
策略模式.png上下文(Context)角色:持有一个Strategy的引用,负责使用Strategy角色.
抽象策略(Strategy):抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需的接口.
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为,负责Strategy角色的接口.
文件下载之后可以选择是保存在内存中还是在磁盘中,根据不同的策略有不同的实现:
class Download {
var strategy:Strategy?
init(strategy:Strategy) {
self.strategy = strategy
}
func downloadFile() {
print("FlyElephant---文件下载成功")
self.strategy?.saveData()
}
}
class Strategy {
func saveData() {}
}
class DiskStrategy: Strategy {
override func saveData() {
print("FlyElephant---保存至磁盘中")
}
}
class MemoryStategy: Strategy {
override func saveData() {
print("FlyElephant---保存至内存中")
}
}
let download:Download = Download(strategy: DiskStrategy())
download.downloadFile()
策略模式的优点
①策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
② 使用策略模式可以避免使用多重条件(if-else)语句.多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后.
策略模式的缺点
① 客户端必须对所有的策略都有了解,如果不理解不同策略的区别,会造成无法选择的困境.
② 如果备选策略很多,会导致出现大量的策略类,造成策略大爆炸.
网友评论