免费商城网站建站系统,建设跳转公积金网站,南宁seo推广公司,自己制作网页的网站核心思想
策略模式是一种行为型设计模式#xff0c;它定义了一系列算法#xff0c;并将每个算法封装在独立的类中#xff0c;使得它们可以互相替换。策略模式让算法的变化独立于使用它的客户端#xff0c;从而使得客户端可以根据需要动态切换算法#xff0c;而不需要修改…核心思想
策略模式是一种行为型设计模式它定义了一系列算法并将每个算法封装在独立的类中使得它们可以互相替换。策略模式让算法的变化独立于使用它的客户端从而使得客户端可以根据需要动态切换算法而不需要修改其代码。策略模式的核心是将算法与使用算法的客户端解耦使得算法可以独立于客户端变化。
**Context**持有一个策略对象的引用负责调用策略的具体实现。 **Strategy**定义所有支持的算法的公共接口。 **ConcreteStrategy**实现Strategy接口提供具体的算法实现。
使用场景
多种算法切换如排序算法快速排序、冒泡排序等或支付方式信用卡、支付宝等。 避免条件语句当代码中有大量条件分支用于选择不同行为时可以用策略模式替代。 算法复用当多个类需要共享相同的行为但行为的具体实现不同时。 动态切换行为如游戏中的角色在不同状态下使用不同的攻击策略。 测试与调试策略模式可以方便地替换算法的实现便于测试和调试。
解决的问题
代码重复问题 如果多个类使用相同的算法但算法的实现分散在各处会导致代码重复。策略模式将算法集中管理避免重复。
紧耦合问题 在传统设计中算法直接嵌入在客户端代码中导致客户端与算法紧耦合。策略模式通过将算法抽象为接口解耦了客户端和具体算法。
扩展性问题 新增算法时需要修改客户端代码。策略模式允许动态添加新算法而无需修改现有代码。
条件分支问题 当代码中有大量条件分支用于选择不同行为时策略模式可以将其替换为对象的多态调用使代码更清晰。
优点
**开闭原则**新增算法无需修改现有代码只需添加新的策略类。 **解耦**将算法的实现与使用分离提高代码的灵活性和可维护性。 **复用性**策略类可以在不同上下文中复用。 **简化测试**每个策略类可以独立测试。
缺点
**类数量增加**每个算法都需要一个单独的类可能导致类的数量增多。 **客户端需要了解策略**客户端需要知道有哪些策略并选择合适的策略。 **性能开销**策略模式可能引入额外的对象创建和调用开销。
示例代码
如下代码中Context类即客户端是稳定、可以不变的变化的是策略而策略是根据运行时的实际情况来选择的。通过继承Strategy类并重写execute()接口实现策略的扩展。
#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 执行策略A std::endl;}
};// 具体策略B
class ConcreteStrategyB : public Strategy {
public:void execute() const override {std::cout 执行策略B std::endl;}
};// 上下文类持有策略对象并调用其方法
class Context {
private:std::unique_ptrStrategy strategy; // 使用智能指针管理策略对象public:// 构造函数允许传入策略对象Context(std::unique_ptrStrategy s) : strategy(std::move(s)) {}// 设置策略void setStrategy(std::unique_ptrStrategy s) {strategy std::move(s);}// 执行策略void executeStrategy() const {if (strategy) {strategy-execute();} else {std::cout 未设置策略 std::endl;}}
};int main() {// 创建上下文对象并初始化为策略AContext context(std::make_uniqueConcreteStrategyA());context.executeStrategy(); // 输出: 执行策略A// 动态切换到策略Bcontext.setStrategy(std::make_uniqueConcreteStrategyB());context.executeStrategy(); // 输出: 执行策略Breturn 0;
}代码说明
Strategy抽象策略接口定义了所有具体策略类必须实现的方法execute()。 ConcreteStrategyA 和 ConcreteStrategyB具体策略类分别实现了不同的算法或行为。 Context上下文类持有一个策略对象的引用并提供了设置策略和执行策略的方法。 智能指针使用std::unique_ptr管理策略对象的生命周期避免内存泄漏。
运行结果
执行策略A
执行策略B总结
通过策略模式我们可以将算法的实现与使用算法的环境解耦使得算法可以独立于客户端代码进行扩展和修改。这种设计模式特别适用于需要动态切换算法的场景。