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

这篇具有很好参考价值的文章主要介绍了设计模式(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++)
#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;
};
#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;
}

运行结果:

设计模式(4)--对象行为(9)--策略,设计模式,设计模式  6.1 很容易实现StrategyC,策略替代很方便(3.2)

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

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

  6.4 使用模板类时,具体策略可以不继承自抽象Strategy。文章来源地址https://www.toymoban.com/news/detail-767669.html

到了这里,关于设计模式(4)--对象行为(9)--策略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式(十四):行为型之策略模式

    设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式(七):结构型之适配器模式 设计模式(八):结构型之装

    2024年02月09日
    浏览(43)
  • 软件设计模式与体系结构-设计模式-行为型软件设计模式-策略模式

    策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在独立的类中,使它们可以相互替换。策略模式使得算法可以独立于使用它们的客户端而变化。 下面是一个使用策略模式的简单代码示例,以解释其工作原理: 在上述示例中,策略模

    2024年02月13日
    浏览(122)
  • 设计模式(4)--对象行为(6)--备忘录

    1. 意图     在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。     这样以后可以将该对象恢复到原先保存的状态。 2. 三种角色    原发器(Originator)、备忘录(Memento)、负责人(Caretaker) 3. 优点    3.1 保持了封装边界。屏蔽了原发器的内部信息。

    2024年02月04日
    浏览(42)
  • 【设计模式与范式:行为型】61 | 策略模式(下):如何实现一个支持给不同大小文件排序的小程序?

    上一节课,我们主要介绍了策略模式的原理和实现,以及如何利用策略模式来移除 if-else 或者 switch-case 分支判断逻辑。今天,我们结合“给文件排序”这样一个具体的例子,来详细讲一讲策略模式的设计意图和应用场景。 除此之外,在今天的讲解中,我还会通过一步一步地

    2024年02月10日
    浏览(42)
  • 设计模式 -- 策略模式(传统面向对象与JavaScript 的对比实现)

    规则:根据员工的工资基数和年底绩效情况计算年终奖 初级实现 缺点 多重 if else 违反开发-封闭原则,可维护性差 复用性差 使用组合函数重构代码 使用组合函数来重构代码,把各种算法封装到一个个的小函数里面,这些小函数有着良好的命名,可以一目了然地知道它对应着

    2024年02月11日
    浏览(67)
  • 设计模式行为模式-命令模式

    命令模式(Command Pattern)是一种行为型设计模式,用于将请求封装为对象,从而使你可以使用不同的请求、队列或者日志请求来参数化其他对象。这样可以实现请求的参数化操作、队列化和日志化,且能够支持撤销操作。 命令模式由以下几个核心组件组成: 命令(Command)

    2024年02月10日
    浏览(45)
  • 【设计模式--行为型--命令模式】

    定义 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储,传递,调用,增加与管理。 结构 抽象命令类(Command)角色:定义命令的接口,声明执行的方法。 具体命令(Concrete Command)

    2024年02月04日
    浏览(37)
  • 设计模式行为型——命令模式

    目录 命令模式的定义      命令模式的实现 命令模式角色 命令模式类图 命令模式举例 命令模式代码实现 命令模式的特点 优点 缺点 使用场景 注意事项         命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。是对命令的封装,每一个命令都是

    2024年02月14日
    浏览(43)
  • 设计模式行为型-状态模式

    状态模式是一种行为型设计模式,用于处理对象在不同状态下的行为变化。它将对象的行为封装在不同状态类中,通过状态的切换实现不同行为的触发。 本文将介绍状态模式的基本概念、应用场景以及优势与适用性。 实现具体状态类 具体工作类: 上下文类包含状态对象的引

    2024年02月10日
    浏览(40)
  • 行为型设计模式——状态模式

    状态模式是比较简单的设计模式,它的主要作用是减少代码中大量的 if-else 或者 switch-case 等逻辑判断(俗称屎山)。它将每个状态定义为一个类,而每个状态类有自己对应的方法,因此当需要根据状态执行逻辑代码时不需要写大量的if-else判断是哪个状态然后执行对应的逻辑

    2024年02月02日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包