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

9. 桥接模式

目录

  • 一、问题引入
  • 二、桥接模式
    • 2.1 概念
    • 2.2 应用
    • 2.3 实现

一、问题引入

  • 环境
    • 开发一个通用的日志记录工具
    • 它支持数据库记录和文本文件记录
    • 既可以运行在.NET平台,也可以运行在Java平台
  • 解决方案
    • 将不同的日志记录方式分别作为单独的对象对待
    • 为日志记录类抽象出一个基类
      在这里插入图片描述
    • 存在问题
      • 不同平台的日志记录,对于操作数据库以及写入文本文件所调用的方式可能并不相同,因此需要继承扩展设计
        在这里插入图片描述
    • 假如现在要增加xml文件的记录方式,则只需要创建XmlFileLog类继承自Log类即可,满足开闭原则。
    • 假如要增加一个不同的平台,则需要在DatabaseLogTextFileLog类分别进行扩展。
      在这里插入图片描述
    • 第二种假设违背了类的单一职责原则:即一个类只有一个引起它变化的原因。第一种假设中引起变化的原因仅仅是存储形式,第二种假设引起变化的原因是存储形式和运行平台

二、桥接模式

2.1 概念

  • 在软件系统中,主要为了应对 “多维度的变化”
  • 桥接模式将抽象部分实现部分相分离。
    在这里插入图片描述

2.2 应用

  1. 将多维度进行拆开,并针对每一个维度单独的进行详细设计。
  2. 实现了针对存储形式的设计(第一个设置图已经实现)。
  3. 实现日志运行平台的设计
    在这里插入图片描述
  4. 将这两部分之间通过对象组合连接起来(桥接模式使用了对象组合方式)。

在这里插入图片描述

2.3 实现

#include <iostream>class ImpLog
{
public:virtual void Execute(const std::string& msg) = 0;virtual ~ImpLog() = default;
};class NImpLog : public ImpLog
{
public:void Execute(const std::string& msg) override{std::cout << ".NET platform: " << msg << std::endl;}
};class JImpLog : public ImpLog
{
public:void Execute(const std::string& msg) override{std::cout << "Java platform: " << msg << std::endl;}
};class Log
{
protected:ImpLog* implementor;public:void setImplentor(ImpLog* src){implementor = src;}virtual void Write(const std::string& log){implementor->Execute(log);}virtual ~Log() = default;
};class DatabaseLog : public Log
{
public:void Write(const std::string& log){implementor->Execute(log);}
};class TextFileLog : public Log
{
public:void Write(const std::string& log){implementor->Execute(log);}
};int main()
{//.Net平台下的DataBase LogLog* dblog = new DatabaseLog();dblog->setImplentor(new NImpLog());dblog->Write(".Net");//Java平台下的Text File LogLog* txtlog = new TextFileLog();txtlog->setImplentor(new JImpLog());txtlog->Write("Java");return 0;
}
http://www.lryc.cn/news/601682.html

相关文章:

  • 递归查询美国加速-技术演进与行业应用深度解析
  • Cursor下利用Stagewise实现 “所见即改” 的前端开发体验~
  • MyBatis-Plus IService 接口全量方法实现与测试(续)
  • 【程序员私房菜】python尖椒炒口蘑
  • 神经网络模型训练需要的内存大小计算方法
  • 任务提醒工具怎么选?对比16款热门软件
  • 疯狂星期四文案网第21天运营日记
  • 商汤发布具身智能平台,让机器人像人一样和现实世界交互
  • EMCCD相机与电可调变焦透镜的同步控制系统设计与实现
  • Chainlink Functions:为智能合约插上连接现实世界的翅膀
  • PowerDesigner 画ER图并生成sql 教程
  • 青少年编程能力等级测评试卷及答案 Python编程(三级)
  • Rouge:面向摘要自动评估的召回导向型指标——原理、演进与应用全景
  • Java面试全方位解析:从基础到AI的技术交锋
  • 如何思考一个动态规划问题需要几个状态?
  • 负载均衡 LoadBalance
  • 阻止网页重定向
  • 6、企业信息化
  • 齐护Ebook科技与艺术Steam教育套件 可图形化micropython Arduino编程ESP32纸电路手工
  • 装修独栋别墅需要注意的细节有哪些?
  • 像素农场播种机-作物模拟器HTML+CSS+JavaScript
  • Linux 系统网络配置及 IP 地址相关知识汇总
  • JVM terminated. Exit code=1
  • 通俗理解主机的BIOS和UEFI启动方式
  • SpringBoot 整合 Langchain4j AIService 深度使用详解
  • uniapp input 聚焦时键盘弹起滚动到对应的部分
  • Python入门构建网页
  • Python爬虫实战:研究netaddr库相关技术构建IP地址信息采集分析系统
  • r0env2024:开箱即用的AI工具集成Kali发新版
  • Java学习-------外观模式