当前位置: 首页 > wzjs >正文

网站备案查询背景布网站建站哪家公司好

网站备案查询背景布,网站建站哪家公司好,全球疫情实时动态,惠州企业建站程序《C Software Design》第五章:The Strategy and Command Design Patterns 本章重点介绍两种“行为型设计模式”:策略模式(Strategy Pattern)与命令模式(Command Pattern)。核心问题分别是: Stra…

《C++ Software Design》第五章:The Strategy and Command Design Patterns

本章重点介绍两种“行为型设计模式”:策略模式(Strategy Pattern)命令模式(Command Pattern)。核心问题分别是:

  • Strategy:隔离如何做(算法实现)
  • Command:隔离做什么(执行动作)

深入探讨传统面向对象实现存在的不足,以及如何借助现代 C++ 的特性(如模板、std::function、值语义)来替代经典写法。


Guideline 19: Use Strategy to Isolate How Things Are Done

目的

我们不希望主类直接控制算法细节,而是通过抽象策略接口将具体算法实现分离出去,使行为具有可配置性、可替换性和可测试性

Analyzing the Design Issues

问题:如何在不修改主类逻辑的前提下,动态切换算法行为?

示例情境:有一个 Shape 类,它支持不同的“绘图策略”,例如 Vector 和 Raster。

The Strategy Design Pattern Explained

struct DrawingStrategy {virtual void draw() const = 0;virtual ~DrawingStrategy() = default;
};struct VectorDrawing : DrawingStrategy {void draw() const override {std::cout << "Drawing with vector lines.\n";}
};struct RasterDrawing : DrawingStrategy {void draw() const override {std::cout << "Drawing with pixels.\n";}
};class Shape {std::unique_ptr<DrawingStrategy> strategy_;
public:Shape(std::unique_ptr<DrawingStrategy> s) : strategy_(std::move(s)) {}void draw() const { strategy_->draw(); }
};

你可以在运行时将不同策略注入 Shape 对象中。

Analyzing the Shortcomings of the Naive Solution

  • 使用虚函数有运行时开销;
  • 所有策略都要继承接口类,样板代码多;
  • 无法表达“静态策略”:某些行为在编译期就应决定。

Comparison Between Visitor and Strategy

维度StrategyVisitor
用于扩展算法的实现操作的种类
使用方式客户端选择策略对象类型自身 accept(visitor) 回调
增加新操作只需新建策略类必须修改 visitor 接口和实现类
动态 vs 静态可动态切换通常是静态绑定

Policy-Based Design(模板策略)

借助模板参数实现“编译期策略注入”,零运行时成本:

template<typename DrawingPolicy>
class Shape {
public:void draw() const {DrawingPolicy{}.draw();}
};struct SVGPolicy {void draw() const { std::cout << "SVG drawing\n"; }
};Shape<SVGPolicy> s1;
s1.draw(); // 输出:SVG drawing

优势

  • 零开销(没有虚表);
  • 策略间互不耦合;
  • 更易于组合多个策略(如日志 + 绘图)。

Guideline 20: Favor Composition over Inheritance

原则解释

继承是紧耦合,破坏封装;组合是一种更灵活的复用方式。

class Engine {
public:virtual void start() = 0;
};class Car {std::unique_ptr<Engine> engine_;
public:Car(std::unique_ptr<Engine> e) : engine_(std::move(e)) {}void drive() {engine_->start();}
};

将“引擎行为”作为组合注入而非通过继承扩展 Car,支持运行时替换、功能复用。


Guideline 21: Use Command to Isolate What Things Are Done

概念

命令模式将“动作”封装为对象,可用于延迟执行、宏命令、撤销、操作记录等场景。

Command Design Pattern Explained

struct Command {virtual void execute() = 0;virtual ~Command() = default;
};struct PrintCommand : Command {void execute() override {std::cout << "Printing document...\n";}
};class Invoker {std::vector<std::unique_ptr<Command>> queue_;
public:void add(std::unique_ptr<Command> cmd) {queue_.push_back(std::move(cmd));}void run() {for (auto& cmd : queue_) {cmd->execute();}}
};

🆚 Strategy vs Command

特征StrategyCommand
抽象的目标算法的实现方式动作的执行内容
使用方式context->run(strategy)cmd->execute()
通常搭配对象算法、排序、日志用户事件、GUI、请求调度

Shortcomings of Classic Command

  • 每种命令都需创建一个类,数量膨胀;
  • 动作封装不够灵活,类耦合度高。

Guideline 22: Prefer Value Semantics over Reference Semantics

GoF 风格的问题

经典实现中,大量使用 shared_ptr 或裸指针管理命令/策略对象,容易造成资源管理混乱:

auto cmd = std::make_shared<PrintCommand>();

一旦多个地方持有相同指针,生命周期不易掌控。

现代 C++:值语义策略

struct PrintCommand {void operator()() const {std::cout << "Print\n";}
};std::vector<PrintCommand> cmds = { PrintCommand{} };
  • 无需担心内存泄露;
  • 容器友好;
  • 更安全、易于并发使用。

Value Semantics in std::function

using Command = std::function<void()>;std::vector<Command> cmds;
cmds.push_back([](){ std::cout << "Execute\n"; });

将命令行为直接封装为“值”,即函数对象。


Guideline 23: Prefer a Value-Based Implementation of Strategy and Command

std::function 简化命令和策略

using Strategy = std::function<void()>;class Shape {Strategy draw_;
public:Shape(Strategy s): draw_(std::move(s)) {}void draw() const { draw_(); }
};Shape s([](){ std::cout << "Draw with OpenGL\n"; });
s.draw(); // 输出:Draw with OpenGL

不需要接口类、不需要虚函数,不需要手动管理生命周期。

性能分析

实现方式是否需堆分配是否有虚函数性能
传统 Command是(智能指针)中等
Policy 模板策略高(内联优化)
std::function否(小对象优化)中高(取决闭包大小)

std::function 的限制

  • 不支持接口描述:没有显式接口要求;
  • 不能静态类型检查(传错参数不会编译失败);
  • 拷贝时需注意闭包大小(超过 SBO 时可能 heap 分配)。

小结

模式作用建议实现方式场景适用性
Strategy隔离“如何做”(算法)模板策略 / std::function日志、绘图、压缩算法
Command隔离“做什么”(动作)std::functionGUI、宏命令、异步请求
Value Semantics简化资源管理,提高安全性使用函数对象 / RAII所有现代 C++ 项目
Policy零运行时开销的行为注入模板性能敏感、泛型组件设计
http://www.dtcms.com/wzjs/356651.html

相关文章:

  • 网站建设外包公司排名网店如何推广自己的产品
  • 如何请人创建一个网站吴中seo页面优化推广
  • wordpress投票类主题沈阳专业seo关键词优化
  • 做网站开发需要培训吗如何做好网站的推广工作
  • 上海网站建设外包网站策划运营
  • 做报表的网站泉州百度竞价公司
  • 做医药商城网站的公司怎么做电商平台
  • 自己建网站做代理商快点tv下载安装
  • 静态网页模板下载后怎么修改亚马逊seo是什么意思
  • 品牌营销型网站建设网上培训
  • 数字城市建设网站网络赚钱推广
  • 免费的黄台app下载广西百度seo
  • wordpress附件上传开鲁seo网站
  • 上海做网站优化公司巨量引擎官网
  • 网站里可以添加视频做背景吗正规的培训机构有哪些
  • 罗湖做网站报价站长数据
  • 办公室装修设计多少钱马鞍山seo
  • 系统门户网站建设详细功能百度推广的五大优势
  • l林州住房建设部官方网站上海网优化seo公司
  • 国外做黄漫的网站百度搜索热词排行榜
  • 淘客联盟如何做网站推广中山网站seo
  • 那种软件可以做视频网站学生网页设计模板
  • 公众号运营内容百度seo推广软件
  • 做风筝网站互联网推广的方式
  • 网站建设公司的转型网站维护推广的方案
  • 网站的盈利模式爱营销电信版下载app最新版
  • 学校网站建设实训火爆产品的推广文案
  • 不锈钢网站哪家最专业网站建设需要多少钱
  • 免费手机网站开发中国培训网
  • 自己的网站怎么做网盘推荐友情链接