设计模式大白话——策略模式

这篇具有很好参考价值的文章主要介绍了设计模式大白话——策略模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

​ 从名字上来看,此设计模式的核心是 策略 二字,所谓策略,说白了就是能够针对不同的情况随机应变。接下来我将带你领略策略模式的魅力

二、场景举例

  • 场景描述

    ​ 现在有一个游戏,游戏中有各种各样的鸭子,有些鸭子是呱呱叫会用翅膀飞,有些鸭子是嘎嘎叫能够利用科技的力量飞行等等。现在需要通过代码对其进行设计

  • 代码

    ​ 很容易想到的是建议一个鸭子类,它有飞行和发出叫声的方法,然后不同的子类去实现各自的方法,下面以 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

到了这里,关于设计模式大白话——策略模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用大白话举例子讲明白云计算

    前几天王坚院士在2023云栖大会上发表了关于云计算的演讲,听得我是热血沸腾,王院士称AI和云计算的结合是“云计算的第三次浪潮”,对此我深表认同。但是身边的很多朋友还不知道云计算是什么意思,有些人还认为百度云和百度云盘是一个东西,下面我用大白话举例说明

    2024年02月04日
    浏览(36)
  • 大白话聊聊“深度学习”和“大模型”

    1950年图灵发表论文《计算机器与智能》( Computing Machinery and Intelligence),提出了“机器智能”(Machine Intelligent)的概念,并且提出了著名的“图灵测试”的方法来判断机器是否有智能。 1956年,达特茅斯会议,“人工智能”(Artificial Intelligent)概念被首次提出,人工智能作

    2024年02月02日
    浏览(42)
  • React底层原理分析(简单大白话版本)

    react包 react-dom包 react-reconciler包 scheduler包 Fiber对象 diff算法 深度优先遍历  堆排序 链表,栈操作 react合成事件

    2024年01月20日
    浏览(30)
  • 大白话理解-微信小程序获取授权

    微信用户授权,才可以操作微信官方的某些接口。 简单来说就是:微信定义了很多接口,然后他们认为有一部分是涉及到用户使用安全的,所以把这一部分划分了出来,然后这一部分按照功能来拆开各种范围。于是有了scope列表的东西,scope翻译为中文是范围的意思。(定位属于

    2024年02月02日
    浏览(27)
  • 用大白话举例子讲明白区块链

    什么是区块链?网上这么说: 区块链是一种分布式数据库技术,它以块的形式记录和存储交易数据,并使用密码学算法保证数据的安全性和不可篡改性。每个块都包含了前一个块的哈希值和自身的交易数据,形成了一个不断增长的链条。 区块链的特点包括: 分布式:区块链

    2024年02月04日
    浏览(39)
  • Lighting Network(闪电网络)大白话解析

    通道(Channel),通过在主网宣布通道建立,而后交易双方转至链下交易,把多次交易在链下完成,不占用主网资源,交易完成后在主网广播最终交易结果,无需更改主网机制即可实现吞吐量的提高。 “通道”是一个逻辑上的概念,实际使用过程中并没有“通道”,即使在数据传

    2024年02月04日
    浏览(32)
  • 别样的git学习--大白话学git

    希望用更加口语化的语言向大家讲述git 的魅力 1、Git-stash (贮存) 想象一下,你正在写一封重要的邮件,但突然你的老板告诉你需要立即处理另一个紧急任务。你还没完成邮件,不想丢失已写的内容,但你也需要一个干净的工作空间来处理新的任务。在这种情况下,Git 的

    2024年01月24日
    浏览(33)
  • 用大白话来讲讲多线程的知识架构

    感觉多线程的知识又多又杂,自从接触java,就在一遍一遍捋脉络和深入学习。现在将这次的学习成果展示如下。 什么是多线程? 操作系统运行一个程序,就是一个线程。同时运行多个程序,就是多线程。即在同一时间,并行做多件事。 “并行”是相对于我们这些用户来说的

    2024年02月11日
    浏览(31)
  • 大白话说说Docker容器默认网络模型工作原理

    Docker的默认网络模型 —— 桥接模式(Bridge) 当你不做任何特殊设置时,Docker会使用一种叫做“桥接模式”的网络设置。这就像是给你的容器小房子安装了一个虚拟的桥接网络。这座桥连接着容器和你的电脑(宿主机),还能与外界通信。 虚拟网络桥 :想象一下,在你的电

    2024年02月21日
    浏览(31)
  • Java【直接插入排序】算法, 大白话式详细图文解析(附代码)

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包