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

设计模式--策略模式(Strategy Pattern)

时间:2024-02-14 10:22:30浏览次数:20  
标签:策略 -- Pattern algorithmInterface 接口 Strategy 算法 Context 设计模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户端。

策略模式主要包含以下几个角色:

  1. Strategy(策略):这是一个接口,通常用于定义所有支持的算法的公共接口。
  2. ConcreteStrategy(具体策略):这是实现了Strategy接口的具体算法类。每一个ConcreteStrategy都包装了一种具体的算法或行为。
  3. Context(上下文):这是一个使用策略对象的类。通常它包含一个策略对象,并且可以定义一个接口来让策略访问它的数据。

策略模式的主要优点是:

  • 定义了一系列可重用的策略或算法,并让客户端可以选择其中一个策略或算法,也可以动态地切换策略。
  • 可以避免使用多重条件选择语句(如if...else或switch...case)。
  • 提高了算法的复用性和灵活性。

策略模式适用于以下场景:

  • 当一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现时。
  • 当需要在不同的情况下使用不同的策略,或者策略还可能在未来用其他方式来实现时。

以下是一个简单的C++实现的策略模式(Strategy Pattern)示例:

#include <iostream>

// 抽象策略
class Strategy {
public:
    virtual void algorithmInterface() = 0;
    virtual ~Strategy() {}
};

// 具体策略A
class ConcreteStrategyA : public Strategy {
public:
    void algorithmInterface() override {
        std::cout << "Strategy A's algorithm..." << std::endl;
    }
};

// 具体策略B
class ConcreteStrategyB : public Strategy {
public:
    void algorithmInterface() override {
        std::cout << "Strategy B's algorithm..." << std::endl;
    }
};

// 上下文
class Context {
public:
    Context(Strategy* strategy) : strategy_(strategy) {}
    ~Context() { delete strategy_; }
    void contextInterface() {
        strategy_->algorithmInterface();
    }

private:
    Strategy* strategy_;
};

int main() {
    Context* contextA = new Context(new ConcreteStrategyA());
    contextA->contextInterface();

    Context* contextB = new Context(new ConcreteStrategyB());
    contextB->contextInterface();

    delete contextA;
    delete contextB;

    return 0;
}

在这个例子中,Strategy是抽象策略,定义了algorithmInterface接口。ConcreteStrategyA和ConcreteStrategyB是具体策略,实现了algorithmInterface接口。
Context是上下文,它维护了一个对策略对象的引用,这个引用可以是抽象策略类,也可以是具体策略类。在contextInterface接口中,上下文会调用策略的algorithmInterface接口。
通过这种方式,我们可以动态地改变上下文的策略,从而改变上下文的行为。

帮助理解:
算法的定义和使用是分开的。
Context类中引用算法的抽象类。
客户端可以根据情况使用Context类 设置"算法的具体类"来覆盖"算法的抽象类"。

标签:策略,--,Pattern,algorithmInterface,接口,Strategy,算法,Context,设计模式
From: https://www.cnblogs.com/lanyangsh/p/18015061

相关文章

  • 使用MICE进行缺失值的填充处理
    在我们进行机器学习时,处理缺失数据是非常重要的,因为缺失数据可能会导致分析结果不准确,严重时甚至可能产生偏差。处理缺失数据是保证数据分析准确性和可靠性的重要步骤,有助于确保分析结果的可信度和可解释性。在本文中,我们讲重点介绍MICE。MICE(MultipleImputationbyChainedEq......
  • 势能相关做题记录
    势能相关P5905【模板】全源最短路(Johnson)题意:有负权情况下的全源最短路。思路:Johnson全源最短路可以在\(O(nm\logm)\)的复杂度内解决带有负权的全源最短路。这个算法的巧妙之处在于为每个点赋予势能\(h_i\)。从一个点到另一个点,无论走什么路径,势能的变化量都是一定的。......
  • C++ map自定义比较函数遵守严格弱序
    C++map自定义比较函数遵守严格弱序问题背景及定位背景:这个问题是在将tablesaw(一个Java的数据处理项目)迁移到C++时出现的。问题位置:SplitOn()函数,在数据流水线中的aggregate阶段。问题描述:使用google/benchmark进行了批量化的性能测试,在测试中出现偶发性段错误,几率大约在万分......
  • 农村高中生源转型期提升学生二次函数建模能力的课堂探究
       良好的教学情境是促使学生开展主动思考和深度学习活动的重要保障。数学知识都源于现实生活,所以在培养高中生建模思想与意识期间,除了注意结合数学教材中的相关内容之外,也要注意紧密联系学生的实际生活。因为建模思想的应用都建立在对生活中实际问题的抽象化表达上,所以如果......
  • 细扣Redis Cluster原理
    细扣RedisCluster原理RedisCluster是Redis提供的一种分布式数据存储解决方案,它能够将大量数据分布到多个节点上,实现高可用性和水平扩展。以下是RedisCluster的工作原理及其如何保证数据安全、一致性以及避免脏数据问题的详细解释:工作原理数据分片(Slot分配):RedisClu......
  • 3.在NET.API中去使用Nacos
    nuget安装:1.nacos-sdk-csharp1.3.42.nacos-sdk-csharp.AspNetCore1.3.43.nacos-sdk-csharp.Extensions.Configuration1.3.41.新建项目NacosService1,NacosService2,和NacosClient配置NacosService1的appsettings.json,NacosService2也要配哈{"Logging":{&quo......
  • 第24天:安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制
    #文件管理模块-上传-过滤机制1、无过滤机制2、黑名单过滤机制3、白名单过滤机制4、文件类型过滤机制 $_FILES:PHP中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保存到服务器上。它是一个包含上传文件信息的数组,包括文件名、类型、大小、临时文件名等信息......
  • [cpp]: 双向链表的实现
    [cpp]: 双向链表的实现    一、思路或者原理 1、双向链表的实现思路:1.1、链节(dataclass):【链节data】是组成【链条chains】的基本单元,【链节data】用于存储数据。1.1.1、链节内的数据成员:从当前【链节data】指向前一个【链节data】的指针......
  • English96
    心灵导师TheOdyssey(奥德赛)mentor是Odysseus的挚友,Odysseus之子Telemachus&Mentor,智慧女神Athena:雅典娜化装成mentor帮助他们mentor:导师;良师益友;可信赖的顾问ment:tothink想;mind:心智ment+-al构成a.mental:精神的;智力的,心理的+-ism=主义;学说mentalism:心理主......
  • jvm shutdownHook + spring 自定义事件实现业务处理
    jvm的shutdownHook可以实现对于jvm退出的一些处理,比如资源清理,异常事件通知,spring自定义事件(或者使用内部的)可以实现bean的一些事件驱动处理,两个结合起来可以方便我们进行一些业务处理一些业务场景资源清理服务停止业务状态一致性补偿服务注册场景中的取消注册服务停......