(一)详解策略模式

目录

必备背景知识

一.使用场景

二.核心逻辑

三.举例子

总结


必备背景知识

  • 针对接口编程,而不是针对实现编程(修改功能更加容易,我们只需要对接口作出修改即可)
  • 优先使用组合而不是继承(继承会导致后来的子类都具备了父类的功能,有时候我们想让子类没有父类的某些功能)

一.使用场景

由当前对象所拓展出来的对象有可能有新增功能,或者不具备原来某些功能的时候可以使用。优点在于可拓展性高,维护便捷,能动态的改变对象的属性。若想给所有同一大类但不同属性的不同对象增加一个新的公用功能,直接提供接口即可。不用依次修改。

二.核心逻辑

将不同对象反复变化的部分抽象封装出来,后序修改时只针对变化的部分进行修改这样不会影响其他不变化的部分。

三.举例子

从代码理解好理解一些。假设我们有个基类鸭子,我想拥有不同种类的鸭子子类。不同鸭子拥有不同的行为。有的会叫有的不会叫。我们统一将这些变化的属性抽象出来并单独成为一个行为类。同时基类提供接口来获取这些行为对象。同时针对这个行为,我们可以实现多种不同的实现方法类。这样我们通过子类继承基类,并在子类内特化这些行为对象选择对应的方法类就能动态的实现不同鸭子的不同行为了。把行为的决定权下放到子类而不是基类决定。基类只负责提供获取接口。

首先我们看基类duck

class Duck 
{
public:std::unique_ptr<FlyBehavior> flyBehavior;    //两个行为对象,由不同子类对象特化具体行为std::unique_ptr<QuackBehavior> quackBehavior;Duck(std::unique_ptr<FlyBehavior> flyBehavior, std::unique_ptr<QuackBehavior> quackBehavior);    //这里采取将行为类在构造函数内传递的方式,不同的鸭子将不同方法传给鸭子基类以实现构造virtual ~Duck() = default;    //析构函数虚继承为了正确释放void performQuack() const    //父类提供接口给用户,用户直接调取对应鸭子的状态{quackBehavior->quack();    //调用行为类内的接口,具体实现由行为类下的实现方法类完成}virtual void display() const = 0;    //用于测试或实现鸭子具体功能void performFly() const{flyBehavior->fly();}
};

这样我们就需要提供对应的行为类。也就是飞行行为和叫行为。我们需要在两种行为类内实现接口提供给后来的行为的实现类使用,并且保持一致。同时让鸭子的基类提供给用户使用的接口函数调用这个接口,就能直接获取到不同的行为实现方法。

这里以飞行行为为例

class FlyBehavior {
public:virtual void fly() const = 0;    //后序实现所有有关飞行行为的实现方法都要提供fly的实现virtual ~FlyBehavior() = default;
};

这样我们就可以实现关于飞行的多种不同实现方式。包括但不限于用翅膀飞或者完全不能飞。

class FlyNoWay: public FlyBehavior {
public:    void fly() const {std::cout << "I can't fly!" << std::endl;    //实现不会飞的鸭子}
};class FlyWithWings: public FlyBehavior {
public:virtual void fly() const {std::cout << "I'm flying!" << std::endl;    //实现用翅膀飞的鸭子}
};

到目前为止大体框架已经完成了。若想添加动态设置功能。我们可以不用智能指针并且在duck的基类内添加set接口,将参数设置为行为方式,将接受到的行为方式复制给当前鸭子内的行为方式即可。

总结

策略模式定义了一个算方族,分辨封装,使得相互之间可以互相转化。让各个模块独立。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql优化之索引

索引官方定义&#xff1a;索引是帮助mysql高效获取数据的数据结构。 索引的目的在于提高查询效率&#xff0c;可以类比字典。 可以简单理解为&#xff1a;排好序的快速查找数据结构 在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这种数据…

html和css相关操作

html第一个网页 <!DOCTYPE html> <!--html文档声明&#xff0c;声明此文档是一个html5的文档--> <html> <!--html文档开头标签--><head><!--html文档的设置标签&#xff0c;文档的设置及资源的引用都写在这个标签中--><meta charset&q…

[Pytorch]语义分割任务分类的实现

文章目录 [Pytorch]语义分割任务分类的实现 [Pytorch]语义分割任务分类的实现 假如我们定义了一个网络用于语义分割任务&#xff0c;这个网络简称为model() 语义分割任务要做的是&#xff1a; 对于一个图片输入input&#xff0c;大小为&#xff08;B&#xff0c;C&#xff0c…

如何快速走出网站沙盒期(关于优化百度SEO提升排名)

网站沙盒期是指新建立的网站在百度搜索引擎中无法获得好的排名&#xff0c;甚至被完全忽略的现象。这个现象往往发生在新建立的网站上&#xff0c;因为百度需要时间来评估网站的质量和内容。蘑菇号www.mooogu.cn 为了快速走出网站沙盒期&#xff0c;需要优化百度SEO。以下是5个…

IDEA .iml文件及.idea文件夹详解

.iml文件 idea 对module 配置信息之意&#xff0c; infomation of module。每个模块都有一个iml文件。 IDEA中的.iml文件是项目标识文件&#xff0c;缺少了这个文件&#xff0c;IDEA就无法识别项目。跟Eclipse的.project文件性质是一样的。并且这些文件不同的设备上的内容也会…

epoch,bach_size和iteration定义

文章目录 epoch&#xff1a;当一个完整的数据集通过了神经网络一次并且返回了一次&#xff0c;这个过程称为一个epoch.当一个epoch对于计算机来说太大的时候&#xff0c;就要把它分成多个小块&#xff08;即batch&#xff09;。batch&#xff1a;当不能将数据一次性通过神经网络…

3D成像技术概述

工业4.0时代,三维机器视觉备受关注,目前,三维机器视觉成像方法主要分为光学成像法和非光学成像法,这之中,光学成像法是市场主流。 飞行时间3D成像 飞行时间成像(Time of Flight),简称TOF,是通过给目标连续发送光脉冲,然后用传感器接收从物体返回的光,通过探测光脉…

力扣刷题-链表理论基础

什么是链表 什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向null&#xff08;空指针的意思&a…

python SCPClient 远程文件 到 本地

【python】之SCPClient库&#xff0c;远程文件copy&#xff01;_python scp_PP的博客-CSDN博客 import paramiko # 用于调用scp命令 from scp import SCPClient###实例化SSH sshparamiko.SSHClient() ssh.load_system_host_keys() ssh.set_missing_host_key_policy(paramiko.Au…

毫米波雷达 TI IWR1443 在 ROS 中进行 octomap 建图

个人实验记录 /mmwave_ti_ros/ros_driver/src/ti_mmwave_rospkg/launch/1443_multi_3d_0.launch <launch><!-- Input arguments --><arg name"device" value"1443" doc"TI mmWave sensor device type [1443, 1642]"/><arg…

minio文件上传

1.代码 大佬仓库&#xff1a;https://gitee.com/Gary2016/minio-upload?_fromgitee_search 关于这个代码的讲解&#xff1a;来自b站 2.准备minio 参考&#xff1a;[1]、[2] 2.1 下载 官网&#xff1a;https://min.io/download#/windows 2.2 启动 ①准备一个data文件夹…

HTML <video> 标签

实例 一段简单的 HTML5 视频: <video src="movie.ogg" controls="controls"> 您的浏览器不支持 video 标签。 </video>定义和用法 <video> 标签定义视频,比如电影片段或其他视频流。 浏览器支持 元素ChromeIEFirefoxSafariOpera&l…

Android开发笔记 :理解Fragment

Android开发笔记&#xff1a;理解Fragment 导言 本篇文章产生的原因很简单&#xff0c;就是我在了解Android Jetpack中的Lifecycle框架时发现Lifecycle具体时间和状态的更新都是由一个名为ReportFragment的Fragment来跟踪的&#xff0c;为了更好的了解Fragment是如何追踪Activ…

P1057 [NOIP2008 普及组] 传球游戏

原题链接&#xff1a;传球游戏 状态转移方程的定义非常重要&#xff0c;找到合适的定义方法&#xff0c;从何下手&#xff1f;从分析题目开始&#xff0c;最后一步是从何而来的&#xff1f;临界条件是什么&#xff0c;需要进一步思考 此题到达第一个人的时候只有两种情况&…

以太网协议

以太网 以太网协议格式&#x1f3a8;目的地址,源地址mac地址格式 以太网协议格式&#x1f3a8; 目的地址,源地址 此处的地址,叫做mac地址(物理地址),长度是6个字节 mac地址的作用也是用来区分不同的主机 IP地址的长度是4字节 IP地址负责网络层(整体)转发,mac地址负责数据链路层…

pytest框架运行时的参数,以及多线程分布式运行用例、运行指定模块用例

一、运行时的参数 在上一篇博客中写了pytest最为核心的运行时前后置如何设置&#xff0c;细心的朋友可能也会发现其实我们当时就加过运行时的参数-vs。 pytest.main([‘-s’])&#xff1a;能打印出调试信息&#xff0c;print()或者日志都可以直接打印在控制台上。 pytest.ma…

基于微信小程序的房屋租赁系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明用户微信小程序端的主要功能有&#xff1a;户主微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文…

CSRF攻击(跨站请求伪造)

1.CSRF原理 程序员开发的时候&#xff0c;未对相关页面进行token和referer判断&#xff0c;造成攻击者可构造自己的URL地址欺骗用户进行点击 漏洞分析&#xff08;低级可绕过&#xff09; 通过这个可以更改密码 改为了password 中级多了referer头可以绕过 源代码 多了一个refer…

MVC设计思想理解和ASP.NET MVC理解

三层模式 三层模式包括:UI层,业务逻辑层,数据访问层,模型层 MVC设计思想和ASP.NET MVC理解 MVC设计思想: MVC的思想就是把我们的程序分为三个核心的模块,这三个模块的详细介绍如下: 模型(Model) :负责封装与引用程序的业务逻辑相关的数据以及对数据的处理方法。模型层有对…

单片机论文参考:5、基于单片机的自动打铃系统

摘 要 本次设计中的LED数码管电子时钟电路采用24小时制记时方式,本次设计采用AT89C51单片机的扩展芯片和6个PNP三极管做驱动&#xff0c;由三块LED数码管构成的显示系统&#xff0c;与传统的基于8/16位普通单片机的LED显示系统相比较&#xff0c;本系统在不显著地增加系统成本的…