一、概述
从名字上来看,此设计模式的核心是 策略 二字,所谓策略,说白了就是能够针对不同的情况随机应变。接下来我将带你领略策略模式的魅力
二、场景举例
-
场景描述
现在有一个游戏,游戏中有各种各样的鸭子,有些鸭子是呱呱叫会用翅膀飞,有些鸭子是嘎嘎叫能够利用科技的力量飞行等等。现在需要通过代码对其进行设计
-
代码
很容易想到的是建议一个鸭子类,它有飞行和发出叫声的方法,然后不同的子类去实现各自的方法,下面以 go 代码为例:
package main // Duck 鸭子接口 type Duck interface { fly() quack() } // MallardDuck 绿头鸭 type MallardDuck struct { Name string } func (d MallardDuck) fly() { println("用翅膀飞起来了") } func (d MallardDuck) quack() { println("呱呱呱") } // RedheadDuck 红头鸭 type RedheadDuck struct { Name string } func (d RedheadDuck) fly() { println("坐火箭飞起来了") } func (d RedheadDuck) quack() { println("呱呱呱") }
通过上述方法,当游戏中增加一种鸭子的时候我们只需要增加一个实例即可,似乎能够满足最开始的需求了。
现在我们的新需求又来了,现在增加了很多种类的鸭子,除此之外,还为鸭子增加了游泳的行为。这个时候如果继续沿用上述方法,你就会发现,你需要去改动 Duck 接口,并且还需要为每个子类实现此方法。如果子类非常的多,这将是一件非常痛苦的事情。我们现在需要想想新的解决办法了。
问题究竟出在哪里了呢?仔细观察代码,你会发现,这种设计会随着时间的推移子类的数量越来越多,一旦新增,并且会有很多重复的代码,例如:很多鸭子发出声音的行为其实是一样的,也有很多鸭子的飞行方式也是一样的等等。
现在我们需要解决目前所遇到的问题,究其原因,其实都是继承惹的祸,为此我们需要牢记一个很重要的原则:
多 用 组 合 少 用 继 承
依据这个原则,我们之前继承的都是各种行为,那样做缺点非常明显,现在我们需要将器改为组合的方式。没错,其实就是组合各种行为。你可以自己先想一想该如何设计,然后再去看下面的代码:
package main type Duck struct { Name string flyBehavior FlyBehavior // 飞行行为 quackBehavior QuackBehavior // 叫声行为 } // FlyBehavior 飞行行为接口 type FlyBehavior interface { fly() } type FlyWithWings struct { } func (f FlyWithWings) fly() { println("用翅膀飞起来了") } type FlyWithRocket struct { } func (f FlyWithRocket) fly() { println("坐火箭飞起来了") } // QuackBehavior 叫声行为接口 type QuackBehavior interface { quack() } type Quack struct { } func (q Quack) quack() { println("呱呱呱") } type Squeak struct { } func (q Squeak) quack() { println("吱吱吱") } func main() { // ------------------ 通过组合的方式 ------------------ ducks := []Duck{ Duck{ Name: "绿头鸭", flyBehavior: FlyWithWings{}, quackBehavior: Quack{}, }, Duck{ Name: "红头鸭", flyBehavior: FlyWithRocket{}, quackBehavior: Squeak{}, }, } for _, duck := range ducks { duck.flyBehavior.fly() duck.quackBehavior.quack() } // 输出: // 用翅膀飞起来了 // 呱呱呱 // 坐火箭飞起来了 // 吱吱吱 }
通过上面的代码,不难看出,上述代码只需要拓展各种行为即可,不需要为每一个 Duck 类把所有行为重新都实现一遍,日后非常易于拓展。
上述的代码示例比较简单,如果你参考其他描述策略模式的资料,还会看到 上下文 的概念,有的是用于保存“策略”的引用,有的是保存“策略”所需的统一的上下文。其实这都不是最核心的,最核心的是理解何为 ”策略“。
三、小结
-
模式定义
策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
-
个人理解文章来源:https://www.toymoban.com/news/detail-600998.html
说白了,策略模式最核心的就是客户依赖于接口而不是具体的实现,因此客户能够根据需要去选择具体的实现,所谓的策略也就是:能够随意组合各种实现得到一个全新的组合文章来源地址https://www.toymoban.com/news/detail-600998.html
到了这里,关于设计模式大白话——策略模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!