C 桥接模式 - 开关和电器

桥接模式(Bridge Pattern)是将抽象部分与它的实现部分分离,使它们都可以独立地变化。1

模式结构

UML 结构图:

  • Abstraction(抽象类):用于定义抽象类的接口,并且维护一个指向 Implementor 实现类的指针。它与 Implementor 之间具有关联关系。

  • RefinedAbstraction(扩充抽象类):扩充由 Abstraction 定义的接口,在 RefinedAbstraction 中可以调用在 Implementor 中定义的业务方法。

  • Implementor(实现类接口):定义实现类的接口,这个接口不一定要与 Abstraction 的接口完全一致,事实上这两个接口可以完全不同。

  • ConcreteImplementor(具体实现类):实现了 Implementor 定义的接口,在不同的 ConcreteImplementor 中提供基本操作的不同实现。在程序运行时,ConcreteImplementor 对象将替换其父类对象,提供给 Abstraction 具体的业务操作方法。

案例分析

对于开关和电器来说,不管任何时候,都可以在不触及另一方的情况下进行更换。比如,可以在不更换开关的情况下换掉灯泡(或风扇),也可以在不接触灯泡(或风扇)的情况下更换掉开关,甚至可以在不接触开关的情况下将灯泡和风扇互换。

这看起来很自然,当然也应该是这样!当不同的事物联系到一起时,它们应该在一个可以变更或者替换的系统中,以便不相互影响或者使影响尽可能的小,这样才能更方便、更低成本地去管理系统。试想一下,如果要更换房间里的一个灯泡,还必须把开关也换了,你会考虑使用这样的系统吗?

代码实现

创建实现类接口

所有电器都有一些共性,可以被打开和关闭:

// implementor.h
#ifndef IMPLEMENTOR_H
#define IMPLEMENTOR_H// 电器
class IEquipment
{
public:virtual ~IEquipment() {}// 打开virtual void PowerOn() = 0;// 关闭virtual void PowerOff() = 0;
};#endif // IMPLEMENTOR_H

创建具体实现类

接下来,是真正的电器 - 电灯和风扇,它们实现了 IEquipment 接口:

// concrete_implementor.h
#ifndef CONCRETE_IMPLEMENTOR_H
#define CONCRETE_IMPLEMENTOR_H#include "implementor.h"
#include // 电灯
class Light : public IEquipment
{
public:// 开灯void PowerOn() override {std::cout << "Light is on." << std::endl;}// 关灯void PowerOff() override {std::cout << "Light is off." << std::endl;}
};// 风扇
class Fan : public IEquipment
{
public:// 打开风扇void PowerOn() override {std::cout << "Fan is on." << std::endl;}// 关闭风扇void PowerOff() override {std::cout << "Fan is off." << std::endl;}
};#endif // CONCRETE_IMPLEMENTOR_H

创建客户端

很好,是时候将开关和电器关联起来了:

// main.cpp
#include "refined_abstraction.h"
#include "concrete_implementor.h"#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete p; p=nullptr;} }
#endifint main()
{// 创建电器 - 电灯、风扇IEquipment *light = new Light();IEquipment *fan = new Fan();/*** 创建开关 - 拉链式开关、两位开关* 将拉链式开关和电灯关联起来,将两位开关和风扇关联起来**/ISwitch *pullChain = new PullChainSwitch(light);ISwitch *twoPosition = new TwoPositionSwitch(fan);// 开灯、关灯pullChain->On();pullChain->Off();// 打开风扇、关闭风扇twoPosition->On();twoPosition->Off();SAFE_DELETE(twoPosition);SAFE_DELETE(pullChain);SAFE_DELETE(fan);SAFE_DELETE(light);getchar();return 0;
}

输出如下:

Switch on the equipment with a pull chain switch.

Light is on.

Switch off the equipment with a pull chain switch.

Light is off.

Switch on the equipment with a two-position switch.

Fan is on.

Switch off the equipment with a two-position switch.

Fan is off.

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos8配置本地光盘yum源_CentOS8 配置本地yum源的详细教程

centos8发行版通过 baseos 和应用流 (appstream) 仓库发布&#xff0c;appstream 是对传统 rpm 格式的全新扩展&#xff0c;为一个组件同时提供多个主要版本centos8 自带封装了nginx&#xff0c;这篇文章给大家介绍centos8 配置本地yum源&#xff0c;具体内容如下所示&#xff…

javafx显示image_如何摆脱JavaFX中的重点突出显示

javafx显示image今天&#xff0c;有人问我是否知道摆脱JavaFX控件&#xff08;分别是按钮&#xff09;的焦点突出的方法&#xff1a; 有关此问题的大多数文章和提示建议添加&#xff1a; .button:focused {-fx-focus-color: transparent; }但是使用这种样式&#xff0c;仍然…

android aop静态方法,spring aop 不能对静态方法进行增强解决

想要通过aop的方式记录HttpUtils发出的post请求日志&#xff0c;但是 aop 不能对静态方法进行增强。只能对实例方法进行增强。。如果一定要增强静态方法&#xff0c;我们可以对目标类使用单例模式&#xff0c;然后通过调用实例方法去调用那个静态方法&#xff0c;而且对应的对象…

汉字笔画动图怎么做_隶书基本笔画教程(动态图)

隶书开创并奠定了汉字的书写形式。而隶书的美时而古朴遒劲&#xff0c;时而秀美温润&#xff0c;实在是令人神往。笔法有方有圆&#xff0c;方圆并用。下面文章以明朗的笔迹演示&#xff0c;结合相对切实的例字&#xff0c;给大家详尽讲解隶书的基本写法。掌握这些基本写法后&a…

C语言没有引用,只有指针

这个问题是昨晚上有同学在知识星球提问&#xff0c;但是因为前两天一直在出差&#xff0c;比较累&#xff0c;没认真回答&#xff0c;今天打球回来&#xff0c;就把这个事情解决了。我想说的已经在题目说明的很清楚了&#xff0c;C语言是没有引用的&#xff0c;引用是在C 里面才…

java日志使用_使用Java 8防止日志过宽

java日志使用一些日志将被机器消耗并永久保存。 其他日志仅用于调试和供人类使用。 在后一种情况下&#xff0c;您通常要确保您不会产生太多的日志&#xff0c;尤其是不会产生太宽的日志&#xff0c;因为一旦行长超过一定大小&#xff08; 例如&#xff0c;此Eclipse bug &…

android 磁场传感器 罗盘,HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教程 带Arduino 51源代码...

//***************************************// HMC5883 51串口测试程序// 使用单片机STC89C51// 晶振&#xff1a;11.0592M// 显示&#xff1a;PC串口// 编译环境 Keil uVision2// 参考宏晶网站24c04通信程序// 时间&#xff1a;2011年3月1日//*******************************…

python如何实现人工智能应用锁_如何清除应用锁的数据库

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

C/C 代码规范注释有哪些讲究?

如果领导给你一个项目的源码让你阅读&#xff0c;并理解重构代码&#xff0c;但里面一句注释都没有&#xff0c;我想这肯定是之前同事“删库跑路”了。看一份源码什么很重要&#xff1f;除了各种代码规范之外&#xff0c;还有一个比较重要的就是注释。注释虽然写起来很痛苦, 但…

记忆化搜索 递归缓存_需要微缓存吗? 营救记忆

记忆化搜索 递归缓存缓存解决了各种各样的性能问题。 有很多方法可以将缓存集成到我们的应用程序中。 例如&#xff0c;当我们使用Spring时&#xff0c;可以轻松使用Cacheable支持。 非常简单&#xff0c;但我们仍然必须配置缓存管理器&#xff0c;缓存区域等。有时&#xff0c…

qq互联android sdk,qq互联.Android

导读&#xff1a;2.2调用示例&#xff0c;这里以发送文字微博接口的调用为例例&#xff0c;来说明通过requestAsync调用兼容接口的方法&#xff1a;&#xff0c;在上面的调用中&#xff0c;调用获取用户信息接口的示例代码如下&#xff1a;&#xff0c;调用发送带图微博接口的&…

go语音protobuf_golang 使用 protobuf 的教程

1、下载protobuf的编译器protoc地址&#xff1a;window&#xff1a;下载: protoc-3.3.0-win32.zip解压&#xff0c;把bin目录下的protoc.exe复制到GOPATH/bin下&#xff0c;GOPATH/bin加入环境变量。当然也可放在其他目录&#xff0c;需加入环境变量&#xff0c;能让系统找到pr…

C 流插入和流提取运算符的重载

<<运算符的重载C 在输出内容时&#xff0c;最常用的方式&#xff1a;std::cout << 1 <<"hello";提出问题&#xff1a;那这条语句为什么能成立呢&#xff1f;cout 是什么&#xff1f;为什么 << 运算符能用在 cout 上呢&#xff1f;原因&#…

primefaces_使用Bean验证扩展PrimeFaces CSV

primefaces你们中有些人已经知道我和我的合著者Mertalışkan正在研究PrimeFaces Cookbook的2.版。 Packt Publishing允许我从新章节“客户端验证”的一个食谱中摘录一小部分摘录。 这将有助于使读者知道这本书的内容。 在此博客文章中&#xff0c;我想讨论使用Bean验证扩展的P…

android math类,GitHub - Zihin/MathModeling-Android

MathModeling-Android项目背景说明与数学建模有关的基于Android平台的手机应用软件&#xff0c;面向全体人员提供数学建模相关服务&#xff0c;开发人员均为东北大学软件学院本科学生&#xff0c;开发时间为两个月。基本功能实现如下功能&#xff0c;满足同学们在数学建模学习上…

guid主键 oracle_使用GUID作为数据库主键的测试

今天听了MSDN的WebCast&#xff0c;是关于Entlib的数据访问的讲座&#xff0c;末尾我问了两个自己所关心的问题&#xff1a;在一个较大型的应用中&#xff0c;如果需要用到两套以上的数据库(如&#xff1a;SQL Server和Oracle)&#xff0c;是否可以把需要的sql查询全部封装在存…

函数指针,指针函数,函数指针数组

这是一个群友发的笔试题目&#xff0c;里面涉及的东西也比较有意思。直接看代码void (*f[])(char *)这个是个什么东西&#xff1f;我们先看看下面的东西函数指针和指针函数的定义我们看个代码int *func(int a,int b)我们之前说过运算符的优先级&#xff0c;「 * 」 的优先级低…

win10默认浏览器不显示谷歌浏览器_win10系统谷歌浏览器怎么用不了?谷歌浏览器打不开网页的解决方法...

刚接触谷歌Chrome浏览器的时候&#xff0c;会觉得这个软件的操作界面非常地陌生&#xff0c;界面简洁得不像话。win10系统电脑下载好Google Chrome既谷歌浏览器后&#xff0c;发现打不开网页&#xff0c;谷歌浏览器怎么用不了&#xff1f;其实通过设置搜索引擎就可以打开了&…

畅享10e会有鸿蒙吗,功能虽小作用很大 华为畅享10e隐藏功能大揭秘

原标题&#xff1a;功能虽小作用很大 华为畅享10e隐藏功能大揭秘如今使用手机游戏、观影、听音乐、刷短视频、拍照等多种多样的娱乐方式,充斥着年轻人生活之中。作为年轻用户娱乐的重要载体,现在的手机不仅硬件强大,在软件功能上方面也取得了突破性进展,不仅仅是高端机,甚至千元…

jax-ws和jax-rs_使用JAX-RS和Spring构建HATEOAS API

jax-ws和jax-rs在我以前的博客文章中&#xff0c;我展示了如何使用Spring Boot配置Jersey多么容易。 我对Spring Boot和Jersey的探索并未结束&#xff0c;我研究了在Spring Boot应用程序中将Spring HATEOAS与Jersey一起使用的可能性。 Spring HATEOS允许创建遵循HATEOAS原理的R…