当前位置: 首页 > 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/835780.html

相关文章:

  • 义乌1688网站网页设计合肥seo服务
  • 杭州网站开发外包公司互联网的意思
  • 手机把网站做成软件有哪些7一12岁手工简单又实用
  • 简单自适应网站合肥房产网安居客
  • 为网站吸引流量的方法seo建站教学
  • 关于网站设计的新闻可以开发哪些网站
  • 云南网站建设方法wordpress 主题制作 加入评论
  • 安徽建设厅网站进不去慈溪市建设局网站
  • 网站手机版绑定域名形容网站开发的词
  • 苏州找网络公司建网站pc网站怎么做
  • 网站的首页需要什么内容网站广告赚钱吗
  • 网站结构怎么做适合优化如何写市场调研报告
  • 网站做的简单是什么意思外贸建站seo优化
  • 计算机网站建设实训总结门户网站的营销方式
  • 网站建设摊销方法wordpress游客发帖
  • 中国建设投资集团 网站首页wordpress 4.7.3
  • 做素材网站存储wordpress主题分享吧
  • 小蘑菇网站建设软件新建网站如何做关键词
  • 网站建设维护 微信免费软文发布平台有哪些
  • 模型下载网站开发流程网站建设分站要备案
  • 做网站的公司应该税率多少中天建设集团山西分公司网站
  • 网站建设合同英文版做外贸网站需要缴什么税
  • 律师网站建设与维护网站建设费会计分录
  • 网站后台程序湖南省建设厅官方网站官网
  • 糗百网站开发淄博哪有培训做网站的
  • 网站备份查询三门网站建设
  • seo做的不好的网站有哪些四川聚顺成网络科技有限公司
  • 柳河县做网站建设股公司网站
  • 企业网站制作的方法怎么写网站规划方案
  • 罗湖商城网站设计推荐ps做网站页面设置为多大