[学习][笔记]设计模式(基于C/C++实现)<三>策略模式

简介: 设计模式(基于C/C++实现)<三>策略模式

文章目录



前言


策略模式


定义

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

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

主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。


使用场景


关键代码:实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

使用场景:

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。


基本思路

1.创建策略基本抽象接口(Strategy),具体策略(ConcreteStrategy) 继承抽象接口

2.使用算法的上下问(Context),在构造方法中传入具体的策略


实例

切换使用三种算法(加,减,乘)

//strategy.h
#ifndef STRATEGY_H
#define STRATEGY_H
class Strategy {
public:
    virtual int DoOperation(int num1, int num2) = 0;
};
#endif // STRATEGY_H
//strategy_add.h
#ifndef STRATEGY_ADD_H
#define STRATEGY_ADD_H
#include <strategy.h>
class StrategyAdd :public Strategy{
    int DoOperation(int num1, int num2) override;
};
int StrategyAdd::DoOperation(int num1,int num2){
    return num1+num2;
}
#endif // STRATEGY_ADD_H
//strategy_multiply.h
#ifndef STRATEGY_MULTIPLY_H
#define STRATEGY_MULTIPLY_H
#include <strategy.h>
class StrategyMultiply :public Strategy
{
    int DoOperation(int num1, int num2) override;
};
int StrategyMultiply::DoOperation(int num1,int num2){
    return num1*num2;
}
#endif // STRATEGY_MULTIPLY_H
//strategy_substract.h
#ifndef STRATEGY_SUBSTRACT_H
#define STRATEGY_SUBSTRACT_H
#include <strategy.h>
class StrategySubstract :public Strategy
{
    int DoOperation(int num1, int num2) override;
};
int StrategySubstract::DoOperation(int num1, int num2){
    return num1 - num2;
}
#endif // STRATEGY_SUBSTRACT_H
//context.h
#ifndef CONTEXT_H
#define CONTEXT_H
#include <strategy.h>
class Context
{
private:
    Strategy *ptrStrategy;
public:
    Context(Strategy *ptr){
        ptrStrategy = ptr;
    }
    ~Context(){
        delete ptrStrategy;
    }
    int ExecuteStrategy(int num1, int num2){
       return ptrStrategy->DoOperation(num1,num2);
    }
};
#endif // CONTEXT_H
//main.cpp
#include <iostream>
#include <context.h>
#include <strategy.h>
#include <strategy_add.hpp>
#include <strategy_substract.hpp>
#include <strategy_multiply.h>
#include <iostream>
using namespace std;
int main()
{
    Context *ptrContextAdd = new Context(new StrategyAdd);
    int addRet = ptrContextAdd->ExecuteStrategy(2,2);
    cout<<"add = result:"<<addRet<<endl;
    Context *ptrContextSub = new Context(new StrategySubstract);
    int subRet = ptrContextSub->ExecuteStrategy(2,2);
    cout<<"substract result:"<<subRet<<endl;
    Context *ptrContextMul = new Context(new StrategyMultiply);
    int mulRet = ptrContextMul->ExecuteStrategy(2,2);
    cout<<"multiple result:"<<mulRet<<endl;
    return 0;
}
输出:
add = result:4
substract result:0
multiple result:4

总结


demo地址

策略模式:方法的形参为接口对象,实参为接口的实现类

适配器模式:在适配器中定义适配者来辅助实现接口

相似点:都是通过找到已经存在的、运行良好的类来实现接口

不同点:

策略模式 所有的策略都需要暴露出去,由客户端决定使用哪一个策略。

而适配器模式是定义好接口的实现方式以及内部需要引用的类,客户端直接调用适配器的方法

相关文章
|
8月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2344 35
|
8月前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
448 1
|
9月前
|
设计模式 人工智能 算法
基于多设计模式的状态扭转设计:策略模式与责任链模式的实战应用
接下来,我会结合实战案例,聊聊如何用「策略模式 + 责任链模式」构建灵活可扩展的状态引擎,让抽奖系统的状态管理从「混乱战场」变成「有序流水线」。
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
275 14
|
设计模式 算法 开发者
「全网最细 + 实战源码案例」设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列可替换的算法或行为,并将它们封装成独立的类。通过上下文持有策略对象,在运行时动态切换算法,提高代码的可维护性和扩展性。适用于需要动态切换算法、避免条件语句、经常扩展算法或保持算法独立性的场景。优点包括符合开闭原则、运行时切换算法、解耦上下文与策略实现、减少条件判断;缺点是增加类数量和策略切换成本。示例中通过定义抽象策略接口和具体策略类,结合上下文类实现动态算法选择。
577 8
「全网最细 + 实战源码案例」设计模式——策略模式
|
设计模式 存储 缓存
前端必须掌握的设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,旨在将多分支复杂逻辑解耦。每个分支类只关心自身实现,无需处理策略切换。它避免了大量if-else或switch-case代码,符合开闭原则。常见应用场景包括表单验证、风格切换和缓存调度等。通过定义接口和上下文类,策略模式实现了灵活的逻辑分离与扩展。例如,在国际化需求中,可根据语言切换不同的词条包,使代码更加简洁优雅。总结来说,策略模式简化了多条件判断,提升了代码的可维护性和扩展性。
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
224 2
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
247 2
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
213 0

热门文章

最新文章