策略模式:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。
OO原则:
- 封装变化
- 多用组合,少用继承
- 针对接口编程,不针对实现实现编程
解释一下: 这里的算法指的就是 行为,就是指对象的方法。
举个例子吧:比如一个叫鸭子的抽象类,它有一个方法(行为)叫 飞行(fly()), 它有很多的子类(如:红头鸭、橡皮鸭、诱饵鸭等),每一种鸭子的飞行方式都不一样,有的能飞(flyWithWing()),有的和火箭一样飞(flyWithRocket()),有的不会飞(flyNoWay())。
这个时候,我们可以将这个多变的方法(行为)从鸭子类中抽出来,单独建立一个抽象类专门用来处理 飞行 的方式。如下:
// 将 飞行 这个方法,抽象成一个协议 protocol FlyBehaviorInterface { func fly() } // 实例化一个对象,继承 飞行 的那个协议,并 以一种算法 实现它 class FlyWithWings: NSObject, FlyBehaviorInterface { func fly() { println("I'm fly With Wing"); } } // 实例化一个对象,继承 飞行 的那个协议,并 以另一种算法 实现它 class FlyNoWay: FlyBehaviorInterface { func fly() { println("I'm sorry, I can't fly"); } }
在鸭子类的实现:(父类中调用协议的接口即可,子类不用实现)
class Duck: NSObject { // 定义 一个 FlyBehaviorInterface 的对象 var flyBehavior: FlyBehaviorInterface? // 在 performFly() 方法中实现 FlyBehaviorInterface 协议的飞行方法 func performFly() { flyBehavior?.fly() } func displayDuck() { } }
在 调用子类 的时候,来实例化 飞行方式
var mallardDuck: Duck = MallardDuck() // 实例化 飞行方式 (即选择一种 飞行 的方法【行为、算法】) mallardDuck.flyBehavior = FlyWithWings() // 调用 父类中的 飞行方法 mallardDuck.performFly()