首页 > 其他分享 >设计模式--策略(strategy)模式

设计模式--策略(strategy)模式

时间:2024-01-15 17:12:20浏览次数:21  
标签:std 策略 -- 模式 strategy 算法 设计模式 data

策略模式概念

策略模式是一种行为设计模式,它允许定义一系列算法,并将每个算法封装到一个对象中。这些算法对象可以相互替换,使得客户端调用算法的代码与具体算法的实现分离。在C++中,策略模式通常由一个接口类、具体策略类、上下文类和客户端代码组成。

下面是一个使用C++实现策略模式的示例代码:

#include <iostream>
#include <memory>
#include <string>
#include <algorithm>

// 策略接口类
class Strategy {
public:
    virtual void doAlgorithm(std::string& data) = 0;
    virtual ~Strategy() {}
};

// 具体策略类A
class ConcreteStrategyA : public Strategy {
public:
    void doAlgorithm(std::string& data) override {
        std::sort(data.begin(), data.end());
        std::cout << "ConcreteStrategyA: " << data << std::endl;
    }
};

// 具体策略类B
class ConcreteStrategyB : public Strategy {
public:
    void doAlgorithm(std::string& data) override {
        std::sort(data.begin(), data.end(), std::greater<>());
        std::cout << "ConcreteStrategyB: " << data << std::endl;
    }
};

// 上下文类
class Context {
private:
    std::unique_ptr<Strategy> strategy_;
public:
    void setStrategy(std::unique_ptr<Strategy> strategy) {
        strategy_ = std::move(strategy);
    }
    void executeStrategy(std::string& data) {
        if (strategy_) {
            strategy_->doAlgorithm(data);
        }
    }
};

// 客户端代码
int main() {
    Context context;
    std::string data = "aecbd";

    std::unique_ptr<Strategy> strategyA = std::make_unique<ConcreteStrategyA>();
    context.setStrategy(std::move(strategyA));
    context.executeStrategy(data);

    std::unique_ptr<Strategy> strategyB = std::make_unique<ConcreteStrategyB>();
    context.setStrategy(std::move(strategyB));
    context.executeStrategy(data);

    return 0;
}

在这个示例中,我们定义了一个策略接口类Strategy,并实现了两个具体的策略类ConcreteStrategyAConcreteStrategyB。上下文类Context持有一个策略对象,并在客户端代码中可以动态地切换不同的策略来执行算法。

这个示例展示了策略模式的核心思想,即将算法的实现与调用代码分离,使得算法可以独立变化,而不影响客户端代码。

使用场景

在实际开发中,策略模式通常在以下情况下被选择使用:

  1. 多算法选择:当一个系统需要在运行时动态地选择算法时,策略模式非常有用。例如,一个排序算法可以根据用户的选择来进行升序排序、降序排序或其他定制排序。

  2. 减少条件语句:策略模式可以帮助减少大量的条件语句。如果一个系统中存在大量的条件判断,可以使用策略模式将不同的条件分支封装到不同的策略类中,从而使代码更加清晰和易于维护。

  3. 算法的独立性:当需要将算法的实现与调用代码分离,使得算法可以独立变化时,策略模式非常适用。这样可以使得系统更加灵活,易于扩展和维护。

  4. 测试和复用:策略模式可以帮助提高代码的可测试性和可复用性。每个策略类都可以独立进行单元测试,并且可以在不同的上下文中被复用。

总之,策略模式适用于需要在运行时动态选择算法、减少条件语句、提高代码的灵活性和可维护性的情况下。

标签:std,策略,--,模式,strategy,算法,设计模式,data
From: https://www.cnblogs.com/yubo-guan/p/17965819

相关文章

  • 一、文本三剑客1、正则表达式正则表达式被很多程序和开发语言所广泛支持:vim,less,grep,sed,awk,nginx,mysql等正则表达式分两类:基本正则表达式:BREBasicRegularExpressions扩展正则表达式:EREExtendedRegularExpression基本正则表达式元字符字符匹配:.匹配任意单个......
  • vue知识
    v-if和v-for的比较vue组件data函数形式key的作用diff算法你了解哪些vue的性能优化方法一、v-if和v-for的哪个优先级更高,如果两个同时出现,应该怎么优化得到更好的性能在源码中发现,先处理静态节点(staticRoot),再处理once,接着才会处理for,最后处理if(看下图)结论:1......
  • 设计模式
    单例模式的优点1)实例控制:Singleton会阻止其他对象实例化其自己的Singleton对象的副本,从而确保所有对象都访问唯一实例。2)灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程。5.2、单例模式的缺点1)开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的......
  • 聚类算法学习总结
    1.1聚类的定义聚类(Clustering)是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。1.2聚类和分类的区别......
  • Django rest_framework用户认证和权限
    完整的代码https://gitee.com/mom925/django-system使用jwt实现用户认证pipinstalldjangorestframework-simplejwt重新定义一下User类classUsers(AbstractUser):classMeta:db_table="system_users"verbose_name="用户表"......
  • 《三国演义》金句良言
    1、大丈夫生居天地间,岂能郁郁久居人下。2、玉可碎而不可改其白,竹可焚而不可毁其节。3、良禽择木而栖,贤臣择主而事。4、本是同根生,相煎何太急。5、龙游沟壑遭虾戏,凤入牢笼被鸟欺。6、大丈夫处世,不能建立功业,不几与草木同腐乎?7、生子当如孙仲谋。8、宁教我负天下人,休教天下......
  • uboot-5_bootm/bootz启动内核过程
    1images全局变量不管是bootz还是bootm命令,启动kernel都会用到images全局变量。images定义在文件cmd/bootm.c:include/image.h中的定义了bootm_headers_t结构:该结构描述的是bootm启动时的头部信息。该结构又包含了系统镜像头部和系统镜像。1.1bootm头部结构304type......
  • VGA
    1、VGA接口VGA(VideoGraphicsArray)即视频图形阵列,是IBM在1987年推出的使用模拟信号的一种视频传输标准,在当时具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。这个标准对于现今的个人电脑市场已经十分过时。略认识VGA可分为,VGA硬件接口,和VGA协......
  • PuppeteerSharp库在C#中的应用案例
    引言PuppeteerSharp是一个针对GoogleChrome浏览器的高级API库,它允许我们使用C#来控制Chrome浏览器的,比如模拟用户行为操作、爬取网页内容等。本文将介绍如何使用PuppeteerSharp库在C#中实现下载千图网图片并保存为PDF文件的案例。PuppeteerSharp技术PuppeteerSharp提供了一......
  • Lift, Splat, Shoot_ Encoding Images From Arbitrary Camera Rigs by Implicitly Unp
    zotero-key:HP5VFNPQzt-attachments:-"413"title:"Lift,Splat,Shoot:EncodingImagesFromArbitraryCameraRigsbyImplicitlyUnprojectingto3D"citekey:philionLiftSplatShoot2020Lift,Splat,Shoot:EncodingImagesFromArbitr......