桥接模式(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.

声明:

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

C 桥接模式 - 开关和电器相关推荐

  1. java控制灯_Java使用桥接模式实现开关和电灯照明功能详解

    本文实例讲述了Java使用桥接模式实现开关和电灯照明功能.分享给大家供大家参考,具体如下: 一.模式定义 桥接模式,也称桥梁模式,在软件系统中,由于自身的逻辑,具有两个或多个维度的变化,如何应对这种多 ...

  2. 桥接模式Bridge

    简介 Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abstract ...

  3. Python设计模式-桥接模式

    Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...

  4. 大话设计模式—桥接模式

    桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.主要解决:在有多种可能会变化的情况下, ...

  5. 步步为营 .NET 设计模式学习笔记 十三、Bridge (桥接模式)

    概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种"多维度的变化"?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引 ...

  6. 跟着ZHONGHuan学习设计模式--桥接模式

    转载请注明出处! ! !http://blog.csdn.net/zhonghuan1992 全部配套代码均在github上:https://github.com/ZHONGHuanGit/Desig ...

  7. Java设计模式(四):结构性模式(适配器模式、桥接模式、装饰模式、组合模式、外观模式、亨元模式、代理模式)

    目录 一· 适配器设计模式 1.1 现实生活中的适配器例子 1.2 基本介绍 1.3 工作原理 1.4 类适配器模式 1.5 对象适配器模式 1.6 接口适配器模式 1.7 适配器模式在 Spring ...

  8. 图解Java设计模式学习笔记——结构型模式(适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式)

    一.适配器模式(类适配器.对象适配器.接口适配器) 1.现实生活中的例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了国内的电器了. 2.基本介绍 适配器模式(Ad ...

  9. 设计模式自学笔记007_Real(命令模式、备忘录模式、桥接模式)

    设计模式自学笔记007_Real(命令模式.备忘录模式.桥接模式) 一.命令模式 在软件设计的过程中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道请求的操作是哪个.我们只需要 ...

最新文章

  1. CentOS5快速搭建vsftp服务
  2. 集合之四:List接口
  3. NIO和Reactor
  4. Android 在本地程序res/raw中读取数据操作
  5. 基于国家标准的 EndNote 输出样式模板
  6. wordpress 外部数据接口_使用接口方式获取WordPress用户信息的方法
  7. 听说java又过气了?看我运用大数据分析2019年java发展趋势!
  8. JAVA中request.getParameterMap()用法笔记
  9. 获取视图尺寸大小方法
  10. CHIL-SQL-LEFT JOIN 关键字
  11. ibm 的java实现_IBM Java Toolbox for 实现IBM i 消息通信
  12. 操作系统虚拟内存的作用概括
  13. Java程序员转行可以做什么?程序员
  14. 创建Mac的shell命令文件(xxx.sh)
  15. win10键盘错乱如何恢复--win7w.com
  16. 暗藏在 win10 里的 3D 资源宝库
  17. Unity Shader:实现菲涅尔+色散效果以及相关原理解析
  18. R studio界面介绍及par参数详解
  19. acm计算机教育汇刊,ACM 全文数据库
  20. 基于百度AI的人像识别开发的登录模块

热门文章

  1. 使用Spock测试您的代码
  2. jvm默认的初始化参数_您是否应该信任JVM中的默认设置?
  3. tomcat web应用_具有可执行Tomcat的独立Web应用程序
  4. 使用自定义线程池处理并行数据库流
  5. 在Gradle 2.13中更好地处理“在插件Y上找不到属性X”
  6. 独眼巨人反应组织了Java 8库的寒武纪爆发
  7. jsf集成spring_Spring和JSF集成:MVC螺母和螺栓
  8. 人员雇佣 网络流_雇用Java EE开发人员的一些面试问题
  9. 全球数据一致性,事务,微服务和Spring Boot / Tomcat / Jetty
  10. GC对吞吐量和延迟的影响