设计模式学习 - 策略模式

策略模式:

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

 

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()

 

你可能感兴趣的:(设计模式)