策略模式:

   策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。

 

OO原则:

  1.   封装变化
  2.   多用组合,少用继承
  3.   针对接口编程,不针对实现实现编程

 

解释一下: 这里的算法指的就是 行为,就是指对象的方法。

  举个例子吧:比如一个叫鸭子的抽象类,它有一个方法(行为)叫 飞行(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()

 

 posted on 2015-04-14 23:10  子叶_Sky  阅读(204)  评论(0编辑  收藏  举报