2.策略模式

2023-09-17 10:34:15

UML图

在这里插入图片描述

代码

main.cpp

#include "Strategy.h"
#include "Context.h"

void test()
{
	Context* pContext = nullptr;
	
	/* StrategyA */
	pContext = new Context(new StrategyA());
	pContext->contextInterface();

	/* StrategyB */
	pContext = new Context(new StrategyB());
	pContext->contextInterface();

	/* StrategyC */
	pContext = new Context(new StrategyC());
	pContext->contextInterface();

	delete pContext;
	pContext = nullptr;
}

int main()
{
	test();
	system("pause");
}

Strategy.h

#pragma once
#include <iostream>
using namespace std;

/*
策略模式:定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户。
*/

/* 抽象策略基类:定义所有支持算法的公共接口 */
class Strategy
{
public:
	virtual void algorithmInterface() = 0;
};

/* 策略A */
class StrategyA :public Strategy
{
public:
	virtual void algorithmInterface()override
	{
		cout << "算法A实现" << endl;
	}
};

/* 策略B */
class StrategyB :public Strategy
{
public:
	virtual void algorithmInterface()override
	{
		cout << "算法B实现" << endl;
	}
};

/* 策略C */
class StrategyC :public Strategy
{
public:
	virtual void algorithmInterface()override
	{
		cout << "算法C实现" << endl;
	}
};

Context.h

#pragma once
#include "Strategy.h"

/*
笔者感受:使用类C操控类A继承体系A1,A2,A3中公有对外暴露接口。
利用一个额外的类,(1)将strategy抽象策略基类,作为额外类的入参;
(2)将strategy抽象策略基类作为额外类的成员变量,利用多态原理,接收外面传来的具体抽象策略。
(3)对外暴露的接口中,使用成员变量抽象策略基类,调用策略继承体系中的子类们都需要继承的纯虚函数接口。
即可,使用额外类操控策略继承体系中公有对外暴露的接口了。
*/
class Context
{
public:
	Context(Strategy* pStrategy) :m_pStrategy(pStrategy) {}
	void contextInterface();
private:
	Strategy* m_pStrategy{ nullptr };
};

void Context::contextInterface()
{
	m_pStrategy->algorithmInterface();
}


策略模式+简单工厂

  • 优点:策略模式+简单工厂:可以完全将策略继承体系与用户端完全剥离开来,将策略继承体系完全封装起来,对用户完全不可见。
  • 总结
    • 类C通过没什么信息含量的枚举作为入参,利用简单工厂生成类A继承体系中的各子类A1、A2、A3。同时,用基类A作为类C的成员变量,接一下刚生成的类A的子类。
    • 类C对外统一暴露一个接口,该接口中,类C的成员变量类A调用继承体系公有对外暴露的接口func()。

main.cpp

#include "StrategyFactory.h"

/*
策略方法+简单工厂:可以将策略继承体系完全剥离开来,完全封装起来,对用户完全不可见。
*/

void test()
{
	StrategyFactory* pStrategyFactory = nullptr;
	
	/* StrategyA */
	pStrategyFactory = new StrategyFactory(StrategyType::eStrategyA);
	pStrategyFactory->contextInterface();

	/* StrategyB */
	pStrategyFactory = new StrategyFactory(StrategyType::eStrategyB);
	pStrategyFactory->contextInterface();

	/* StrategyC */
	pStrategyFactory = new StrategyFactory(StrategyType::eStrategyC);
	pStrategyFactory->contextInterface();

	delete pStrategyFactory;
	pStrategyFactory = nullptr;
}

int main()
{
	test();
	system("pause");
}

Strategy.h

#pragma once
#include <iostream>
using namespace std;

/*
策略模式:定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户。
*/

/* 抽象策略基类:定义所有支持算法的公共接口 */
class Strategy
{
public:
	virtual void algorithmInterface() = 0;
};

/* 策略A */
class StrategyA :public Strategy
{
public:
	virtual void algorithmInterface()override
	{
		cout << "算法A实现" << endl;
	}
};

/* 策略B */
class StrategyB :public Strategy
{
public:
	virtual void algorithmInterface()override
	{
		cout << "算法B实现" << endl;
	}
};

/* 策略C */
class StrategyC :public Strategy
{
public:
	virtual void algorithmInterface()override
	{
		cout << "算法C实现" << endl;
	}
};

StrategyFactory.h

#pragma once
#include "Strategy.h"

/*
我的感受:使用类C操控类A继承体系A1,A2,A3中公有对外暴露接口。
利用一个额外的类,(1)将strategy抽象策略基类,作为额外类的入参;
(2)将strategy抽象策略基类作为额外类的成员变量,利用多态原理,接收外面传来的具体抽象策略。
(3)对外暴露的接口中,使用成员变量抽象策略基类,调用策略继承体系中的子类们都需要继承的纯虚函数接口。
即可,使用额外类操控策略继承体系中公有对外暴露的接口了。
*/
enum StrategyType
{
	eStrategyA,
	eStrategyB,
	eStrategyC
};

class StrategyFactory
{
public:
	StrategyFactory(StrategyType nType);
	~StrategyFactory();
	void contextInterface();
private:
	Strategy* m_pStrategy{ nullptr };
};

StrategyFactory::StrategyFactory(StrategyType nType)
{
	switch (nType)
	{
	case eStrategyA:
		m_pStrategy = new StrategyA();
		break;
	case eStrategyB:
		m_pStrategy = new StrategyB();
		break;
	case eStrategyC:
		m_pStrategy = new StrategyC();
		break;
	}
}

StrategyFactory::~StrategyFactory()
{
	delete m_pStrategy;
	m_pStrategy = nullptr;
}

void StrategyFactory::contextInterface()
{
	m_pStrategy->algorithmInterface();
}


更多推荐

【无公网IP内网穿透】 搭建Emby媒体库服务器并远程访问「家庭私人影院」

目录1.前言2.Emby网站搭建2.1.Emby下载和安装2.2Emby网页测试3.本地网页发布3.1注册并安装cpolar内网穿透3.2Cpolar云端设置3.3Cpolar内网穿透本地设置4.公网访问测试5.结语1.前言在现代五花八门的网络应用场景中,观看视频绝对是主力应用场景之一,加上移动网络技术的发展,随时随地

vue3.2+ts封装axios

1.创建utils文件夹/server下面创建index.ts,代码如下:importaxios,{AxiosRequestConfig}from"axios";import{BASE_URL,TIMEOUT}from"@/config/axios";/***@说明接口请求返回信息(按照自己的实际情况分配基础请求格式)

解决WSL2占用内存过多问题(Docker on WSL2: VmmemWSL)

解决WSL2占用内存过多问题(DockeronWSL2:VmmemWSL)一、问题描述二、问题解决2.1创建`.wslconfig`文件2.2重启wsl2一、问题描述安装完WSL2后,又安装了Docker,使用了一段时间,发现电脑变卡,进一步查看,发现CPU和内存占用过大,如下图:docker仅仅运行了mysql和zk

【LLM】Prompt tuning大模型微调实战

noteprompttuning可看做是prefixtuning的简化版本,在输入层加入prompttokens,并不需要加入MLP进行调整来解决难训练的问题,作者实验表明随着预训练模型参数量的增加,prompttuning效果逼近finetuning效果文章目录note一、Propmttuning1.peft库中的t

热点探测技术架构设计与实践

1.概述说到热点问题,首先我们先理解一下什么是热点?热点通常意义来说,是指在一段时间内,被广泛关注的物品或事件,例如微博热搜,热卖商品,热点新闻,明星直播等等,所以热点产生主要包含2个条件:1.有限时间,2流量高聚。而在互联网领域,热点又主要分为2大类:1.有预期的热点:比如在电商活动当中推出的爆款联名限量款的商品,又

软件机器人财务报表信息的采集和录入、抵押贷款信息查询助力银行贷款业务管理

随着科技的飞速发展,自动化的应用场景也越来越广泛。博为小帮软件机器人的出现,无疑为众多行业带来了巨大的转变,其中就包括银行贷款业务。软件机器人是一种可以模拟人类行为,自动化执行高重复性任务。银行业务中,许多重复性高、规则明确的工作,如企业客户财务报表信息的采集和录入、抵质押贷款的抵质押物信息查询等,正适合软件机器人的应

安卓备份分区----手动查询安卓系统分区信息 导出系统分区的一些基本操作

在玩机搞机过程中。有时候需要手动查看有些分区信息,或者备份分区的操作。那么今天以小米8为例解析下其中的操作步骤机型:小米8adb版本:https://developer.android.com/studio/releases/platform-tools机型芯片:高通骁龙845手机系统版本:安卓10机型界面:twrp机

嵌入式Linux驱动开发(I2C专题)(四)

编写APP直接访问EEPROM参考资料:Linux驱动程序:drivers/i2c/i2c-dev.cI2C-Tools-4.2:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/AT24cxx.pdf1.硬件连接STM32MP157的I2C模块连

嵌入式学习 - 用电控制电

目录前言:1、继电器2、二极管3、三极管3.1特殊的三极管-mos管3.2npn类型三极管3.3pnp类型三极管3.4三极管的放大特性3.5mos管和三极管的区别前言:计算机的工作的核心原理:用电去控制电。所有的电子元件都有数据手册,不同型号的电子元件需要翻阅对应的数据手册。1、继电器电路图和原理如下:如图所示,当继电

CentOS7安装MySQL

文章目录前言一、MySQL5.71.1安装wget1.2下载&安装MySQL的rpm源1.3修改MySQL安装版本1.4下载并启动MySQL1.5开启MySQL远程连接用户二、MySQL8.0注意事项前言CentOS7的安装,采用的是yum的方式安装。yum方式安装,就类似在Windows下不停的下一步,下一步。根据官

灰度变换原理//test later

灰度变换原理图像灰度变换变换原理:通过变换函数T将原图像像素灰度值r映射为灰度值s:2、灰度反转2.1原理灰度反转:将图像亮暗对调,可以增强图像中暗色区域细节�=�(�)=�−1−�其中L为图像灰度级,0~255灰度图像的灰度级为256.2.2c++opencv代码#include<iostream>#include<

热文推荐