设计模式(4)--对象行为(9)--策略

1. 意图

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。

本模式使得算法可独立于使用它的客户而变化。

2. 三种角色

抽象策略(Strategy)、具体策略(Concrete Strategy)、上下文环境(Context)

3. 优点

3.1 可重用的相关算法系列。

3.2 一个替代继承的方法,算法独立于Context。

3.3 消除了一些条件语句。

3.4 提供了相同行为的不同实现。

4. 缺点

4.1 客户必须了解不同的策略。

4.2 Strategy和Context之间的通信开销。

4.2 增加了对象的数目。

5. 相关模式

5.1 策略对象经常的轻量级的享元对象

6. 代码示意(C++)
cpp 复制代码
#pragma once
class Strategy
{
public:
	virtual int Algorithm(int a, int b) = 0;
};

class StrategyA :public Strategy
{
public:
	virtual int Algorithm(int a, int b) {
		return a + b;
	}
};
class StrategyB :public Strategy
{
public:
	virtual int Algorithm(int a, int b) {
		return a - b;
	}
};


class Context
{
	Strategy* m_pStrategy;
public:
	Context(Strategy* pStrategy) {
		m_pStrategy = pStrategy;
	}
	~Context() {
		delete m_pStrategy;
	}
	int GetResult(int a, int b)
	{
		return m_pStrategy->Algorithm(a, b);
	}

};

template <class AStrategy>
class Context2
{
public:
	int GetResult(int a, int b)
	{
		return theStrategy.Algorithm(a, b);
	}
private:
	AStrategy theStrategy;
};
cpp 复制代码
#include "Strategy.h"
int main() {
	//1. 传参方式
	Context* pContext = new Context(new StrategyA());
	cout << "result:" << pContext->GetResult(8, 2) << endl;
	delete pContext;

	pContext = new Context(new StrategyB());
	cout << "result:" << pContext->GetResult(8, 2) << endl;
	delete pContext;

	//2.模板类
	Context2<StrategyA> aContext;
	cout << "result:" << aContext.GetResult(8, 2) << endl;
	return 0;
}

运行结果:

6.1 很容易实现StrategyC,策略替代很方便(3.2)

6.2 不需要判断语句来选择哪种策略(3.3)

6.3 相同的接口,但可得到不同的结果(3.4)

6.4 使用模板类时,具体策略可以不继承自抽象Strategy。

相关推荐
高晶12 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
高晶13 小时前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员
延晗13 小时前
【从零开始 DeepSeek Harness 插件开发教程】二、一切皆插件:简单理解一下 Cordis 内核与 DSH 心智模型
设计模式·deepseek
高晶14 小时前
Android 通讯录应用开发实战:从零搭建 SQLite 数据持久化完整项目
android·设计模式·前端框架
日和雫20 小时前
封装、继承、多态 & 组合,为什么组合大于继承?
设计模式
代钦塔拉1 天前
【C++/Qt 进阶】设计模式系列(6):桥接模式——把“两个独立变化的维度“拆开
c++·qt·设计模式
haluhalu.1 天前
深入理解AIAgent(1.3)--- 设计模式
人工智能·python·设计模式·langchain
高晶2 天前
CANopen 在 BMS 系统中的 C 语言实战指南
设计模式·程序员
博风2 天前
13、设计模式应用举例:工厂方法模式:创建药品对象
设计模式·工厂方法模式
代钦塔拉2 天前
【C++/Qt 进阶】设计模式系列(5):适配器模式——给“不兼容的接口“贴一层翻译膜
c++·qt·设计模式