当前位置:   article > 正文

C++ 设计模式之桥接模式_设计模式 桥接模式 c++

设计模式 桥接模式 c++

【声明】本题目来源于卡码网(题目页面 (kamacoder.com)

【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】


【简介】什么是桥接模式

        桥接模式(Bridge Pattern)是⼀种结构型设计模式,它的UML图很像⼀座桥,它通过将【抽象部分】与【实现部分】分离,使它们可以独⽴变化,从⽽达到降低系统耦合度的⽬的。桥接模式的主要⽬的是通过组合建⽴两个类之间的联系,⽽不是继承的⽅式。
        举个简单的例⼦,图形编辑器中,每⼀种图形都需要蓝⾊、红⾊、⻩⾊不同的颜⾊,如果不使⽤桥接模式,可能需要为每⼀种图形类型和每⼀种颜⾊都创建⼀个具体的⼦类,⽽使⽤桥接模式可以将图形和颜⾊两个维度分离,两个维度都可以独⽴进⾏变化和扩展,如果要新增其他颜⾊,只需添加新的 Color ⼦类,不影响图形类;反之亦然。


【基本结构】

桥接模式的基本结构分为以下⼏个⻆⾊:

  • 抽象Abstraction :⼀般是抽象类,定义抽象部分的接⼝,维护⼀个对【实现】的引⽤。
  • 修正抽象RefinedAbstaction :对抽象接⼝进⾏扩展,通常对抽象化的不同维度进⾏变化或定制。
  • 实现Implementor : 定义实现部分的接⼝,提供具体的实现。这个接⼝通常是抽象化接⼝的实现。
  • 具体实现ConcreteImplementor :实现实现化接⼝的具体类。这些类负责实现实现化接⼝定义的具体操作。

 

         再举个例⼦,遥控器就是抽象接⼝,它具有开关电视的功能,修正抽象就是遥控器的实例,对遥控器的功能进⾏实现和扩展,⽽电视就是实现接⼝,具体品牌的电视机是具体实现,遥控器中包含⼀个对电视接⼝的引⽤,通过这种⽅式,遥控器和电视的实现被分离,我们可以创建多个遥控器,每个遥控器控制⼀个品牌的电视机,它们之间独⽴操作,不受电视品牌的影响,可以独⽴变化。


【简易实现】

        下⾯是实现桥接模式的基本步骤:(以Java代码作以说明)

1. 创建实现接口

  1. interface Implementation {
  2. void operationImpl();
  3. }

2. 创建具体实现类:实际提供服务的对象

  1. class ConcreteImplementationA implements Implementation {
  2. @Override
  3. public void operationImpl() {
  4. // 具体实现A
  5. }
  6. }
  7. class ConcreteImplementationB implements Implementation {
  8. @Override
  9. public void operationImpl() {
  10. // 具体实现B
  11. }
  12. }

3. 创建抽象接⼝:包含⼀个对实现化接⼝的引⽤。

  1. public abstract class Abstraction {
  2. protected IImplementor mImplementor;
  3. public Abstraction(IImplementor implementor) {
  4. this.mImplementor = implementor;
  5. }
  6. public void operation() {
  7. this.mImplementor.operationImpl();
  8. }
  9. }

4. 实现抽象接⼝,创建RefinedAbstaction 类

  1. class RefinedAbstraction implements Abstraction {
  2. private Implementation implementation;
  3. public RefinedAbstraction(Implementation implementation) {
  4. this.implementation = implementation;
  5. }
  6. @Override
  7. public void operation() {
  8. // 委托给实现部分的具体类
  9. implementation.operationImpl();
  10. }
  11. }

5. 客户端使⽤

  1. // 客户端代码
  2. public class Main {
  3. public static void main(String[] args) {
  4. // 创建具体实现化对象
  5. Implementation implementationA = new ConcreteImplementationA();
  6. Implementation implementationB = new ConcreteImplementationB();
  7. // 使⽤扩充抽象化对象,将实现化对象传递进去
  8. Abstraction abstractionA = new RefinedAbstraction(implementationA);
  9. Abstraction abstractionB = new RefinedAbstraction(implementationB);
  10. // 调⽤抽象化的操作
  11. abstractionA.operation();
  12. abstractionB.operation();
  13. }
  14. }

【使用场景】

         桥接模式在⽇常开发中使⽤的并不是特别多,通常在以下情况下使⽤:

  • 当⼀个类存在两个独⽴变化的维度,⽽且这两个维度都需要进⾏扩展时,使⽤桥接模式可以使它们独⽴变化,减少耦合。
  • 不希望使⽤继承,或继承导致类爆炸性增⻓

        总体⽽⾔,桥接模式适⽤于那些有多个独⽴变化维度、需要灵活扩展的系统


【编码部分】

1. 题目描述

        小明家有一个万能遥控器,能够支持多个品牌的电视。每个电视可以执行开机、关机和切换频道的操作,请你使用桥接模式模拟这个操作。

2. 输入描述

        第一行是一个整数 N(1 <= N <= 100),表示后面有 N 行输入。接下来的 N 行,每行包含两个数字。第一个数字表示创建某个品牌的遥控和电视,第二个数字表示执行的操作。其中,0 表示创建 Sony 品牌的电视,1 表示创建 TCL 品牌的遥控和电视;2 表示开启电视、3表示关闭电视,4表示切换频道。        

3. 输出描述

        对于每个操作,输出相应的执行结果。

4. C++编码实例

  1. /**
  2. * @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
  3. * @file BridgeMode.hpp
  4. * @brief 桥接模式
  5. * @autor 写代码的小恐龙er
  6. * @date 2024/01/11
  7. */
  8. #include <iostream>
  9. #include <string>
  10. using namespace std;
  11. // 前置声明
  12. // 实现化接口
  13. class TV;
  14. // ======== 第一个维度的扩充 ========
  15. // 具体实现类1 -- Sony Tv
  16. class SonyTv;
  17. // 具体实现类2 -- TCL Tv
  18. class TclTv;
  19. // ----------------------------------
  20. // 抽象化接口
  21. class RemoteControl;
  22. // ======== 第二个维度的扩充 ========
  23. // 实现抽象化接口 -- 开机
  24. class TurnOn;
  25. // 实现抽象化接口 -- 关机
  26. class TurnOff;
  27. // 实现抽象化接口 -- 切换频道
  28. class SwitchChannel;
  29. // 实现化接口
  30. class TV
  31. {
  32. // 接口函数
  33. public:
  34. virtual void TurnOnTV() = 0;
  35. virtual void TurnOffTV() = 0;
  36. virtual void SwitchTVChannel() = 0;
  37. };
  38. // 具体实现类1 -- Sony Tv
  39. class SonyTv : public TV
  40. {
  41. public:
  42. // 重载接口函数
  43. void TurnOnTV(){
  44. std::cout << "Sony TV is ON" << endl;
  45. }
  46. void TurnOffTV(){
  47. std::cout << "Sony TV is OFF" << endl;
  48. }
  49. void SwitchTVChannel(){
  50. std::cout << "Switching Sony TV channel" << endl;
  51. }
  52. };
  53. // 具体实现类2 -- TCL Tv
  54. class TclTv : public TV
  55. {
  56. public:
  57. // 重载接口函数
  58. void TurnOnTV(){
  59. std::cout << "TCL TV is ON" << endl;
  60. }
  61. void TurnOffTV(){
  62. std::cout << "TCL TV is OFF" << endl;
  63. }
  64. void SwitchTVChannel(){
  65. std::cout << "Switching TCL TV channel" << endl;
  66. }
  67. };
  68. // 抽象化接口
  69. class RemoteControl
  70. {
  71. // 抽象化接口类持有实现化接口类的实例
  72. protected:
  73. TV *_tv;
  74. public:
  75. // 重载构造函数
  76. RemoteControl(){}
  77. RemoteControl(TV *tv){
  78. this->_tv = tv;
  79. }
  80. // 提供抽象类接口函数
  81. virtual void OperationMode() = 0;
  82. };
  83. // 实现抽象化接口 -- 开机
  84. class TurnOn : public RemoteControl
  85. {
  86. private:
  87. // 实现抽象接口类持有实现化接口类的实例
  88. TV *_tv;
  89. public:
  90. // 重载构造函数 以便后续调用能传入抽象类
  91. TurnOn(TV *tv){
  92. this->_tv = tv;
  93. }
  94. // 重载抽象类接口函数
  95. void OperationMode() override {
  96. this->_tv->TurnOnTV();
  97. }
  98. };
  99. // 实现抽象化接口 -- 关机
  100. class TurnOff : public RemoteControl
  101. {
  102. private:
  103. // 实现抽象接口类持有实现化接口类的实例
  104. TV *_tv;
  105. public:
  106. // 重载构造函数 以便后续调用能传入抽象类
  107. TurnOff(TV *tv){
  108. this->_tv = tv;
  109. }
  110. // 重载抽象类接口函数
  111. void OperationMode() override {
  112. this->_tv->TurnOffTV();
  113. }
  114. };
  115. // 实现抽象化接口 -- 切换频道
  116. class SwitchChannel : public RemoteControl
  117. {
  118. private:
  119. // 实现抽象接口类持有实现化接口类的实例
  120. TV *_tv;
  121. public:
  122. // 重载构造函数 以便后续调用能传入抽象类
  123. SwitchChannel(TV *tv){
  124. this->_tv = tv;
  125. }
  126. // 重载抽象类接口函数
  127. void OperationMode() override {
  128. this->_tv->SwitchTVChannel();
  129. }
  130. };
  131. int main()
  132. {
  133. // 执行操作的数量
  134. int operationNum = 0;
  135. // 输入
  136. std::cin >> operationNum;
  137. // 创建实现化接口
  138. TV *tv = nullptr;
  139. RemoteControl *control = nullptr;
  140. // 遍历输入
  141. for(int i = 0; i < operationNum; i++)
  142. {
  143. // 电视机类型
  144. int tvType = -1;
  145. // 遥控器操作类型
  146. int controlType = -1;
  147. // 输入
  148. std:: cin >> tvType >> controlType;
  149. // 电视机类型
  150. if(!tvType){
  151. tv = new SonyTv();
  152. }
  153. else if(tvType == 1){
  154. tv = new TclTv();
  155. }
  156. else tv = nullptr;
  157. // 若输入指令错误则直接返回
  158. if(tv == nullptr) return 0;
  159. // 遥控器操作类型
  160. if(controlType == 2){
  161. control = new TurnOn(tv);
  162. }
  163. else if(controlType == 3){
  164. control = new TurnOff(tv);
  165. }
  166. else if(controlType == 4){
  167. control = new SwitchChannel(tv);
  168. }
  169. else control = nullptr;
  170. // 若输入指令错误则直接返回
  171. if(control == nullptr) return 0;
  172. // 执行操作
  173. control->OperationMode();
  174. }
  175. delete tv;
  176. tv = nullptr;
  177. delete control;
  178. control = nullptr;
  179. return 0;
  180. }

......

To be continued.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/823043
推荐阅读
相关标签
  

闽ICP备14008679号