C++结构型设计模式之使用抽象工厂来创建和配置桥接模式的例子

embedded/2024/11/25 17:27:11/

下面是一个使用抽象工厂模式来创建和配置桥接模式的示例,场景是创建不同操作系统的窗口(Window)及其对应的实现(WindowImpl)。我们将通过抽象工厂来创建不同操作系统下的窗口和实现。

代码示例

#include <iostream>// 抽象产品:窗口接口
class Window {
public:virtual void draw() = 0;virtual void resize() = 0;
};// 抽象产品:窗口实现接口
class WindowImpl {
public:virtual void drawImpl() = 0;virtual void resizeImpl() = 0;
};// 具体产品:Windows窗口
class WindowsWindow : public Window {
private:WindowImpl* impl;public:WindowsWindow(WindowImpl* impl) : impl(impl) {}void draw() override {std::cout << "Drawing Windows Window" << std::endl;impl->drawImpl();}void resize() override {std::cout << "Resizing Windows Window" << std::endl;impl->resizeImpl();}
};// 具体产品:Linux窗口
class LinuxWindow : public Window {
private:WindowImpl* impl;public:LinuxWindow(WindowImpl* impl) : impl(impl) {}void draw() override {std::cout << "Drawing Linux Window" << std::endl;impl->drawImpl();}void resize() override {std::cout << "Resizing Linux Window" << std::endl;impl->resizeImpl();}
};// 具体产品:Windows窗口实现
class WindowsWindowImpl : public WindowImpl {
public:void drawImpl() override {std::cout << "Drawing Windows Impl" << std::endl;}void resizeImpl() override {std::cout << "Resizing Windows Impl" << std::endl;}
};// 具体产品:Linux窗口实现
class LinuxWindowImpl : public WindowImpl {
public:void drawImpl() override {std::cout << "Drawing Linux Impl" << std::endl;}void resizeImpl() override {std::cout << "Resizing Linux Impl" << std::endl;}
};// 抽象工厂:窗口工厂接口
class WindowFactory {
public:virtual Window* createWindow() = 0;virtual WindowImpl* createWindowImpl() = 0;
};// 具体工厂:Windows窗口工厂
class WindowsWindowFactory : public WindowFactory {
public:Window* createWindow() override {return new WindowsWindow(createWindowImpl());}WindowImpl* createWindowImpl() override {return new WindowsWindowImpl();}
};// 具体工厂:Linux窗口工厂
class LinuxWindowFactory : public WindowFactory {
public:Window* createWindow() override {return new LinuxWindow(createWindowImpl());}WindowImpl* createWindowImpl() override {return new LinuxWindowImpl();}
};int main() {// 创建Windows窗口工厂WindowFactory* windowsFactory = new WindowsWindowFactory();// 使用Windows工厂创建窗口Window* windowsWindow = windowsFactory->createWindow();windowsWindow->draw();windowsWindow->resize();// 创建Linux窗口工厂WindowFactory* linuxFactory = new LinuxWindowFactory();// 使用Linux工厂创建窗口Window* linuxWindow = linuxFactory->createWindow();linuxWindow->draw();linuxWindow->resize();// 清理资源delete windowsFactory;delete windowsWindow;delete linuxFactory;delete linuxWindow;return 0;
}

代码说明

  1. Window:窗口接口,定义了 draw 和 resize 方法。
  2. WindowImpl:窗口实现接口,定义了 drawImpl 和 resizeImpl 方法。
  3. WindowsWindow 和 LinuxWindow:具体的窗口类,分别实现Windows和Linux系统的窗口。
  4. WindowsWindowImpl 和 LinuxWindowImpl:具体的窗口实现类,分别实现Windows和Linux系统的窗口实现。
  5. WindowFactory:抽象工厂接口,定义了 createWindow 和 createWindowImpl 方法。
  6. WindowsWindowFactory 和 LinuxWindowFactory:具体的工厂类,分别创建Windows和Linux系统的窗口及其对应的实现。
  7. main 函数:演示如何使用抽象工厂来创建和配置不同操作系统下的窗口。

通过这种方式,我们可以在不同的操作系统下创建和配置相应的窗口和实现,而不需要为每种操作系统创建大量的子类。


http://www.ppmy.cn/embedded/140436.html

相关文章

第十章 JavaScript的应用

第十章JavaScript的应用 10.1 JavaScript概述 10.1.1 JavaScript简介 10.1.1.1 简单性 JavaScript 的语法相对简单&#xff0c;易于学习和使用。它不需要复杂的编译过程&#xff0c;开发者可以直接在浏览器中编写和调试代码。例如&#xff0c;变量声明可以不指定类型&#xff…

Go与黑客(第一部分)

本篇内容是根据2021年5月份#205 Hacking with Go音频录制内容的整理与翻译 Natalie 和 Mat 从 2 位安全研究人员的角度探讨了 Go 中的黑客行为。 Joakim Kennedy 和 JAGS 都使用 Go 进行黑客攻击&#xff1a;编写恶意软件、硬件黑客、逆向工程 Go 代码等等。 过程中为符合中文…

Spring Boot应用开发实战:构建RESTful API服务

Spring Boot应用开发实战&#xff1a;构建RESTful API服务 在当今快速迭代的软件开发环境中&#xff0c;Spring Boot凭借其“约定优于配置”的理念&#xff0c;以及丰富的生态系统&#xff0c;成为了构建现代微服务架构的首选框架之一。本文将带您深入Spring Boot的世界&…

udp_socket

文章目录 UDP服务器封装系统调用socketbind系统调用bzero结构体清0sin_family端口号ip地址inet_addrrecvfromsendto 新指令 netstat -naup (-nlup)包装器 的两种类型重命名方式包装器使用统一可调用类型 关键字 typedef 类型重命名系统调用popen关于inet_ntoa UDP服务器封装 系…

大数据新视界 -- Hive 数据仓库:架构深度剖析与核心组件详解(上)(1 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

LeetCode 904.水果成篮

LeetCode 904.水果成篮 思路&#x1f9d0;&#xff1a; 求水果的最大数目&#xff0c;也就是求最大长度&#xff0c;我们是单调的向前求解&#xff0c;则能够想到使用滑动窗口进行解答&#xff0c;可以用hash表统计每个种类的个数&#xff0c;kinds变量统计当前种类&#xff0c…

IDEA 2024安装指南(含安装包以及使用说明 cannot collect jvm options 问题 四)

汉化 setting 中选择插件 完成 安装出现问题 1.可能是因为之前下载过的idea&#xff0c;找到连接中 文件&#xff0c;卸载即可。

el-table-column自动生成序号在序号前插入图标

实现效果&#xff1a; 代码如下&#xff1a; 在el-table里加入这个就可以了&#xff0c;需要拿到值可以用scope.$index ​​​​​​​<el-table-column type"index" label"序号" show-overflow-tooltip"true" min-width"40">…