跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 策略模式
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++策略模式 = 策略模式(Strategy Pattern)是一种行为设计模式,它允许在运行时选择算法的行为。这种模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变化不会影响使用算法的客户端。 == 介绍 == 策略模式属于对象行为模式,它通过将算法封装在独立的类中,使得它们可以独立于使用它们的客户端而变化。这种模式特别适用于当一个系统需要在多种算法中选择一种时,或者当一个类有多种行为,而这些行为在类的操作中以多个条件语句的形式出现时。 策略模式的主要组成部分包括: * '''Context'''(上下文):使用策略的类,维护一个对策略对象的引用。 * '''Strategy'''(策略):定义所有支持的算法的公共接口。 * '''ConcreteStrategy'''(具体策略):实现策略接口的具体算法。 == 代码示例 == 以下是一个简单的C++示例,展示策略模式的实现: <syntaxhighlight lang="cpp"> #include <iostream> #include <memory> // 策略接口 class Strategy { public: virtual void execute() const = 0; virtual ~Strategy() = default; }; // 具体策略A class ConcreteStrategyA : public Strategy { public: void execute() const override { std::cout << "Executing Strategy A\n"; } }; // 具体策略B class ConcreteStrategyB : public Strategy { public: void execute() const override { std::cout << "Executing Strategy B\n"; } }; // 上下文类 class Context { private: std::unique_ptr<Strategy> strategy; public: explicit Context(std::unique_ptr<Strategy> strat) : strategy(std::move(strat)) {} void setStrategy(std::unique_ptr<Strategy> strat) { strategy = std::move(strat); } void executeStrategy() const { if (strategy) { strategy->execute(); } } }; int main() { Context context(std::make_unique<ConcreteStrategyA>()); context.executeStrategy(); // 输出: Executing Strategy A context.setStrategy(std::make_unique<ConcreteStrategyB>()); context.executeStrategy(); // 输出: Executing Strategy B return 0; } </syntaxhighlight> '''输出:''' <pre> Executing Strategy A Executing Strategy B </pre> == 类图 == 以下是策略模式的类图表示: <mermaid> classDiagram class Strategy { <<interface>> +execute()* } class ConcreteStrategyA { +execute() } class ConcreteStrategyB { +execute() } class Context { -strategy: Strategy +setStrategy(Strategy) +executeStrategy() } Strategy <|-- ConcreteStrategyA Strategy <|-- ConcreteStrategyB Context o-- Strategy </mermaid> == 实际应用场景 == 策略模式在以下场景中特别有用: 1. '''支付系统''':不同的支付方式(信用卡、PayPal、银行转账)可以作为不同的策略实现。 2. '''压缩工具''':支持多种压缩算法(ZIP、RAR、7z),用户可以动态选择。 3. '''导航系统''':根据交通状况(最快路线、最短距离、避开收费站)选择不同的路径计算策略。 === 支付系统示例 === 以下是一个简化的支付系统示例: <syntaxhighlight lang="cpp"> #include <iostream> #include <memory> // 支付策略接口 class PaymentStrategy { public: virtual void pay(double amount) const = 0; virtual ~PaymentStrategy() = default; }; // 信用卡支付 class CreditCardPayment : public PaymentStrategy { public: void pay(double amount) const override { std::cout << "Paying " << amount << " using Credit Card\n"; } }; // PayPal支付 class PayPalPayment : public PaymentStrategy { public: void pay(double amount) const override { std::cout << "Paying " << amount << " using PayPal\n"; } }; // 支付处理器 class PaymentProcessor { private: std::unique_ptr<PaymentStrategy> strategy; public: void setPaymentStrategy(std::unique_ptr<PaymentStrategy> strat) { strategy = std::move(strat); } void processPayment(double amount) const { if (strategy) { strategy->pay(amount); } } }; int main() { PaymentProcessor processor; processor.setPaymentStrategy(std::make_unique<CreditCardPayment>()); processor.processPayment(100.50); // 输出: Paying 100.5 using Credit Card processor.setPaymentStrategy(std::make_unique<PayPalPayment>()); processor.processPayment(75.25); // 输出: Paying 75.25 using PayPal return 0; } </syntaxhighlight> == 优缺点 == === 优点 === * 可以在运行时切换算法 * 将算法的实现与使用算法的代码分离 * 避免使用多重条件语句 * 符合开闭原则(对扩展开放,对修改关闭) === 缺点 === * 客户端必须了解不同的策略 * 增加了对象的数量 * 策略间的通信可能需要额外的上下文信息 == 数学表示 == 策略模式可以形式化表示为: <math> Context = (S: Strategy) \rightarrow execute() \\ Strategy = \{s_1, s_2, ..., s_n\} \\ \forall s_i \in Strategy, s_i.execute() \text{ 提供特定实现} </math> == 总结 == 策略模式是处理算法变化的强大工具,它通过将算法封装在独立的类中,使得它们可以独立变化。这种模式特别适用于需要动态选择算法或需要避免使用复杂条件语句的场景。通过策略模式,代码变得更加灵活、可维护和可扩展。 [[Category:编程语言]] [[Category:C++]] [[Category:C++ 高级主题]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)