首页 > 其他分享 >策略模式

策略模式

时间:2024-05-28 16:44:23浏览次数:23  
标签:std 策略 接口 算法 模式 unique

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式使得算法可以在不影响客户端的情况下发生变化。这种模式的主要目的是通过封装算法,解耦算法的实现与使用,提供不同算法的灵活选择。

策略模式的组成部分

  1. 策略接口(Strategy Interface):定义了一个公共接口,所有具体策略类都需要实现这个接口。
  2. 具体策略类(Concrete Strategy Classes):实现了策略接口,提供具体的算法实现。
  3. 上下文类(Context Class):维护对某个策略对象的引用,并通过策略接口调用具体策略的方法。

策略模式的优点

  1. 简化了算法的交换:可以在运行时选择不同的算法,而不需要修改客户端代码。
  2. 避免多重条件语句:通过使用不同的策略类,避免了在客户端代码中使用大量的条件语句。
  3. 更好的扩展性:可以通过增加新的策略类来扩展新的算法,而无需修改现有代码。

策略模式的应用场景

  1. 需要在不同场合使用不同算法:例如,排序算法、压缩算法、搜索算法等。
  2. 算法在类中不稳定,可能会频繁改变:将算法抽象出来,可以更灵活地进行修改和扩展。
  3. 避免使用多重条件语句:通过使用策略模式,可以将不同的行为封装到独立的策略类中。

示例代码

以下是一个使用策略模式的示例。在这个示例中,我们有一个简单的支付系统,支持两种支付方式:信用卡支付和现金支付。

策略接口

#include <iostream>
#include <memory>

// 策略接口
class PaymentStrategy {
public:
    virtual void pay(int amount) = 0;
    virtual ~PaymentStrategy() = default;
};

具体策略类

// 具体策略类:信用卡支付
class CreditCardPayment : public PaymentStrategy {
public:
    void pay(int amount) override {
        std::cout << "Paid " << amount << " using Credit Card." << std::endl;
    }
};

// 具体策略类:现金支付
class CashPayment : public PaymentStrategy {
public:
    void pay(int amount) override {
        std::cout << "Paid " << amount << " using Cash." << std::endl;
    }
};

上下文类

// 上下文类
class PaymentContext {
private:
    std::unique_ptr<PaymentStrategy> strategy;
public:
    PaymentContext(std::unique_ptr<PaymentStrategy> strategy) : strategy(std::move(strategy)) {}
    void executeStrategy(int amount) {
        strategy->pay(amount);
    }
};

使用策略模式

int main() {
    // 使用信用卡支付
    std::unique_ptr<PaymentStrategy> creditCardPayment = std::make_unique<CreditCardPayment>();
    PaymentContext context(std::move(creditCardPayment));
    context.executeStrategy(100);

    // 更换为现金支付
    std::unique_ptr<PaymentStrategy> cashPayment = std::make_unique<CashPayment>();
    context = PaymentContext(std::move(cashPayment));
    context.executeStrategy(200);

    return 0;
}

运行结果

Paid 100 using Credit Card.
Paid 200 using Cash.

总结

策略模式通过定义一系列可互换的算法,并将它们封装到独立的策略类中,使得算法可以在运行时动态替换,提供了更灵活和可扩展的设计方案。策略模式有效地消除了算法的条件分支语句,使代码更加简洁和清晰。

标签:std,策略,接口,算法,模式,unique
From: https://www.cnblogs.com/whcjob/p/18218377

相关文章

  • 盲盒小程序后台管理系统开发挑战及应对策略
    一、引言随着盲盒市场的不断壮大,盲盒小程序后台管理系统的开发成为了关键的一环。然而,在开发过程中,我们面临着数据同步、库存管理和订单处理等一系列技术挑战。本文将详细探讨这些挑战,并提出相应的应对策略。二、数据同步挑战与应对策略挑战:在盲盒小程序中,数据同步是一个......
  • 简单工厂模式、工厂模式、抽象工厂模式
    工厂模式(FactoryPattern)是一种创建对象的设计模式,它提供了一种方法来将对象的创建过程与对象的使用过程分离。工厂模式在软件开发中有广泛的应用,适用于不同的场景和需求。下面是几种常见的工厂模式及其应用场景:1.简单工厂模式(SimpleFactoryPattern)简单工厂模式通过一个工厂......
  • 工厂方法模式(Factory Method Pattern)
    工厂方法模式(FactoryMethodPattern)是一种创建型设计模式,它在父类中提供一个创建对象的方法,允许子类决定实例化哪一个类。工厂方法模式将对象的实例化推迟到子类中进行,使得系统在不修改原有代码的情况下可以扩展,从而实现了开闭原则(对扩展开放,对修改关闭)模式结构抽象工厂(Abstr......
  • 抽象工厂模式(Abstract Factory)
    抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供了一种方式,将一组具有共同主题的单独的工厂封装起来,而不需要指定它们的具体类。抽象工厂模式允许客户端在不指定具体类的情况下创建一系列相互关联或相互依赖的产品族。模式结构抽象工厂模式包含以下角色:抽象......
  • 单例模式(Singleton)
    单例模式(SingletonPattern)是设计模式中最简单也最常见的一种。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在单例模式中,一个类只有一个实例存在,同时该类的实例由一个预先定义好的静态引用变量所持有,以便在整个系统中随时访问它。模式结构与角色单例类......
  • 装饰器模式(Decorator)
    装饰器模式(DecoratorPattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责(即增加其功能),就增加功能来说,装饰器模式相比生成子类更为灵活。装饰器模式是一种对象结构型模式,在其结构图中含有一个作为抽象构件(Component)角色的接口和多个实现了该接口的抽象装饰类......
  • 设计模式概要
    常见的5中设计模式1.但通常所说的“23种设计模式”是指那些在实践中被广泛认可和使用的设计模式。这些设计模式可以分为以下三类:创建型模式(CreationalPatterns):用于处理对象的创建机制,以提高系统的灵活性和可重用性。单例模式(Singleton):确保一个类只有一个实例,并提供一个全局......
  • WorldSpace下的合批策略与ScreenSpace有什么区别
    1)WorldSpace下的合批策略与ScreenSpace有什么区别2)在iOS上用Metal取代OpenGL的多么3)在动画蓝图中将两个或多个动画同时融合到同一个网格4)Mipmap如何限定层级这是第387篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和......
  • Java多线程与并行计算:深入剖析Java线程,线程池,以及利用Java进行并行计算的策略
    一、Java线程概述线程基础概念: 线程是操作系统调度的最小单元,它是进程的一部分,每个线程都有自己的程序计数器、栈和局部变量。线程之间共享进程的堆和方法区。 Java线程创建和启动: 在Java中主要有两种方式创建线程: 继承Thread类:创建一个新class,继......
  • 设计模式大纲
    设计模式大纲设计模式(DesignPattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式可以提高代码的可读性、可扩展性、可靠性和可测试性。设计模式是软件工程中常用的一种软件设计原则,它是一套被反复使用、多数人知晓的、经过分类的、代码设计......