c++的策略模式,就是多态

devtools/2024/11/14 2:41:57/

一、定义:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。
策略模式让算法独立于使用它的客户而独立变化。
二,核心

抽象策略(抽象基类)(Strategy): 抽象策略类。
具体策略(具体子类)(ConcreteStrategy):封装了继续相关的算法和行为。
环境角色(Context):持有一个策略类的引用,最终给客户端调用。

三,UML类图
在这里插入图片描述
用法示例:

1.空调支持3种模式。冷风模式(coldWind), 热风模式(hotWind),无风模式(noWind)。
1.1当选择coldWind模式,将输送冷风;
1.2当选择hotWind模式,将输送热风;
1.3在选择noWind模式时,空调什么都不做。这里coldWind, hotWind, noWind 其实就是ConcreteStrategy。 myStrategy 是抽象策略类。 所以我们开始这么封装我们策略类

myStrategy.h

#pragma once
#include <iostream>
using namespace std;// 抽象策略角色(Strategy)
//抽象基类写了两个虚函数
class myStrategy
{
public:		myStrategy() { std::cout << "new myStrategy" << endl; };virtual ~myStrategy() { std::cout << "delete myStrategy!" << endl; };virtual void blowWind() = 0;
};//具体策略角色(ConcreteStrategy)
class coldWind: public myStrategy
{
public:coldWind() { std::cout << "new coldWind" << endl; };~coldWind() { std::cout << "delete clod wind!" << endl; };void blowWind(){std::cout << "Blowing clod wind!" << endl;}
};//具体策略角色(ConcreteStrategy)
//继承基类实现热风
class hotWind: public myStrategy
{
public:hotWind() { std::cout << "new hotWind" << endl; };~hotWind() { std::cout << "delete hot wind!" << endl; };void blowWind(){std::cout << "Blowing hot wind!" << endl;}
};
//具体策略角色(ConcreteStrategy)
//继承基类实现无风
class noWind: public myStrategy
{
public:noWind() { std::cout << "new noWind" << endl; };~noWind() { std::cout << "delete no wind!" << endl; };void blowWind(){std::cout << "Blowing no wind!" << endl;}
};

context.h
使用基类指针调用子类的方法

#pragma once//环境角色(Context)
#include "myStrategy.h"class windMode
{
public:windMode(myStrategy* wind);~windMode();void blowWind();void freePtr();	
private://环境角色持有的策略类指针(或引用)myStrategy* m_wind;			
};

context.cpp

#include "context.h"windMode::windMode(myStrategy* wind): m_wind(wind)
{
}windMode::~windMode()
{
}void windMode::blowWind()
{m_wind->blowWind();
}void windMode::freePtr()
{if (m_wind){std::cout << "delete memory" << endl;delete m_wind;m_wind = NULL;}
}

用基类指针调用子类方法
main.cpp

#include <iostream>
#include "windMode.h"
using namespace std;
int main()
{//策略模式使用windMode* hot_Wind = new windMode(new hotWind());windMode* cold_Wind = new windMode(new coldWind());windMode* no_Wind = new windMode(new noWind());hot_Wind->blowWind();cold_Wind->blowWind();no_Wind->blowWind();hot_Wind->freePtr();cold_Wind->freePtr();no_Wind->freePtr();return 0;
}

http://www.ppmy.cn/devtools/23824.html

相关文章

PostgreSQL的扩展(extensions)-常用的扩展之pg_stat_statements

PostgreSQL的扩展&#xff08;extensions&#xff09;-常用的扩展之pg_stat_statements 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/…

力扣经典150题第四十七题:汇总区间

目录 题目描述和要求示例解释解题思路算法实现复杂度分析测试和验证总结和拓展参考资料 题目描述和要求 给定一个无重复元素的有序整数数组 nums&#xff0c;要求返回恰好覆盖数组中所有数字的最小有序区间范围列表。即&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖…

ECMAScript和JavaScript的区别

ECMAScript和JavaScript在多个方面存在区别。 首先&#xff0c;ECMAScript是JavaScript语言的规范和标准&#xff0c;由Ecma国际组织制定。它定义了JavaScript的语法、类型、语句、关键字以及保留字、操作符、对象等。JavaScript则是基于ECMAScript规范的一种实现&#xff0c;…

Thinkphp使用dd()函数

用过Laravel框架的同学都知道在调试代码的时候使用dd()函数打印变量非常方便&#xff0c;在ThinkPHP6及以上的版本框架中也默认加上了这个函数。但是在ThinkPHP5或更低版本的框架中&#xff0c;dd 并不是一个内置的方法&#xff0c;不过我们可以手动添加这个函数&#xff0c;步…

opencv 存储像素值为浮点数的图像 (.tiff)

在存储32CF1格式的深度图像时&#xff0c;怎么也存储不对 存储成jpg格式的&#xff0c;会乱码。be like 13.6的数据存储之后再读取变成…e-30存储成png格式时&#xff0c;会自动把浮点数转换成整数。13.6的数据读取之后就变成14了直接把深度图片存储成.npy格式python处理很简单…

Docker常见问题排查思路与实战

Docker作为一种流行的容器化技术&#xff0c;已经在众多场景中得到广泛应用。然而&#xff0c;在使用过程中&#xff0c;我们难免会遇到各种问题。本文将介绍一些常见的Docker问题及其排查思路&#xff0c;并通过实战案例帮助大家更好地理解和应对这些挑战。 1. Docker容器启动…

Python计算两个时间的时间差(工作笔记需要自取)

目录 专栏导读方法1&#xff1a;方法2总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——> 一晌小贪欢的博客主页求关注 &#x1f44d; 该系列文章…

Java web第四次作业

要求&#xff1a;读取xml文件并在页面中显示出来。 采用三种方式实现&#xff0c;并体会其中的原理&#xff1a; 1.常规方式&#xff0c;controlller控制器不分层 代码&#xff1a;RestController public class PoetController { RequestMapping("/listPoet") pu…