设计模式学习 - 策略模式

本文通过鸭子飞行的例子介绍了策略模式的概念及应用。策略模式允许在运行时选择算法,从而提高代码的灵活性。

策略模式:

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

 

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

 

转载于:https://www.cnblogs.com/ziyeSky/p/4427274.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值