2.策略模式

UML图

代码

main.cpp

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

cpp 复制代码
#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

cpp 复制代码
#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

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

cpp 复制代码
#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

cpp 复制代码
#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();
}
相关推荐
FreeBuf_1 天前
新型TCC绕过漏洞:macOS面临自动化攻击风险
macos·自动化·策略模式
JavaBoy_XJ2 天前
行为型-策略模式
策略模式
崎岖Qiu6 天前
【设计模式笔记24】:JDK源码分析-Comparator中的「策略模式」
java·笔记·设计模式·jdk·策略模式
辣机小司8 天前
【踩坑记录:EasyExcel 生产级实战:策略模式重构与防御性导入导出校验指南(实用工具类分享)】
java·spring boot·后端·重构·excel·策略模式·easyexcel
山风wind9 天前
设计模式-策略模式详解
设计模式·策略模式
“抚琴”的人10 天前
C#上位机策略模式
开发语言·c#·策略模式
梦里小白龙11 天前
JAVA 策略模式+工厂模式
java·开发语言·策略模式
秋邱12 天前
Java面向对象进阶实战:用工厂模式+策略模式优化支付系统
java·bash·策略模式
吃喝不愁霸王餐APP开发者14 天前
基于策略模式动态选择不同地区霸王餐API接口的路由实现
策略模式