C++设计模式4--桥接模式--处理多维度的需求变化

简介:

引言

桥接模式就将要解决什么样的问题呢?我们具几个显示中的例子来加深理解

例子一

    拿汽车在路上行驶的来说。即有轿车,又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶。这你会发现,对于不同的交通工具,行驶在不同的环境中,每个都作为一个需求,我们会有很多种可能的需求,

例子二

再比如说我们每天用的电脑,有各种牌子的,什么Dell,Hp,Acer,Lenovo,Apple,不同的电脑上还可以装不一样的操作系统,比如说Windows(WindowsXP,Windows7.Windows8),Linux(RedHat,Ubunto,LinuxMint,CentOS),MacOS等等,如果每台电脑配上一个操作系统,我么也会有很多的组合。

如果我们每个需求都用一个单独的类来对应,很容易出现问题,我们知道在继承的时候基类和子类的耦合度是很高的

传统方式的缺点

①首先它在遵循开放-封闭原则的同时,违背了类的单一职责原则,即一个类只有一个引起它变化的原因,而这里引起变化的原因却有两个,即电脑牌子的变化和操作系统类型的变化;
②其次是重复代码会很多,不同的电脑安装不同的操作系统也会有一部分的代码是相同的;
③再次是类的结构过于复杂,继承关系太多,难于维护,最后最致命的一点是扩展性太差。如果变化沿着电脑的牌子和不同的操作系统两个方向变化,我们会看到这个类的结构会迅速的变庞大。

小结

我们会发现,以前我们需求中的变动都是单维度的,也就是只有一个需求面在变动,而这次我们面临的时,几个不同的方向同时变动,每个变动,都会产生一个新的需求,我们需要去对应这些需求,以前那些模式都是不划算的,这时候桥接模式就出现了,用以应对这种多维度的需求变动

桥接模式概述

在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。

意图:

GOF在提出桥梁模式的时候指出,桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。


代码我们拿那个电脑上安装操作系统来讲解

首先看操作系统的代码


  1. #ifndef __OS_H_INCLUDED__  
  2. #define __OS_H_INCLUDED__  
  3.   
  4.   
  5. // 操作系统  
  6. class OS  
  7. {  
  8. public :  
  9.     virtual ~OS( ){ };  
  10.     virtual void InstallOSImage( ) const = 0;          // 安装操作系统  
  11.   
  12. };  
  13.   
  14. // WINDOWS操作系统  
  15. class WindowsOS : public OS  
  16. {  
  17. public:  
  18.     virtual ~WindowsOS( ){  };  
  19.     void InstallOSImage( ) const  
  20.     {  
  21.         std::cout <<"安装WINDOWS操作系统" <<std::endl;  
  22.     }  
  23. };  
  24.   
  25. // LINUX操作系统  
  26. class LinuxOS : public OS  
  27. {  
  28. public:  
  29.     virtual ~LinuxOS( ){ };  
  30.     void InstallOSImage( ) const  
  31.     {  
  32.         std::cout <<"安装LINUX操作系统" <<std::endl;  
  33.     }  
  34. };  
  35.   
  36.   
  37. // MACOX操作系统  
  38. class MacOS : public OS  
  39. {  
  40. public:  
  41.     virtual ~MacOS( ){ };  
  42.     void InstallOSImage( ) const  
  43.     {  
  44.         std::cout <<"安装MACOS操作系统" <<std::endl;  
  45.     }  
  46. };  
  47.   
  48.   
  49.   
  50. #endif // __OS_H_INCLUDED__  

下面看电脑的代码

在安装时候,传一个OS*类型的指针进来,从未指定安装某个操作系统

  1. #ifndef __COMPUTER_H_INCLUDED__  
  2. #define __COMPUTER_H_INCLUDED__  
  3.   
  4. #include "OS.h"  
  5.   
  6. // 计算机的基类  
  7. class Computer  
  8. {  
  9. public :  
  10.     virtual ~Computer( ){ };  
  11.     virtual void InstallOS(const OS *os) = 0;          // 在计算机上安装操作系统  
  12.   
  13. };  
  14.   
  15. // 计算机的基类  
  16. class DellComputer : public Computer  
  17. {  
  18. public :  
  19.     virtual ~DellComputer( ){ };  
  20.     void InstallOS(const OS *os)          // 在计算机上安装操作系统  
  21.     {  
  22.         std::cout <<"我有台戴尔电脑..." <<std::endl;  
  23.         os->InstallOSImage( );                      // 安装操作系统的镜像  
  24.         std::cout <<std::endl;  
  25.     }  
  26. };  
  27.   
  28.   
  29.   
  30. // 计算机的基类  
  31. class AcerComputer : public Computer  
  32. {  
  33. public :  
  34.     virtual ~AcerComputer( ){ };  
  35.     void InstallOS(const OS *os)          // 在计算机上安装操作系统  
  36.     {  
  37.         std::cout <<"我有台宏基电脑..." <<std::endl;  
  38.         os->InstallOSImage( );                      // 安装操作系统的镜像  
  39.         std::cout <<std::endl;  
  40.     }  
  41.   
  42. };  
  43.   
  44. // 计算机的基类  
  45. class AppleComputer : public Computer  
  46. {  
  47. public :  
  48.     virtual ~AppleComputer( ){ };  
  49.     void InstallOS(const OS *os)          // 在计算机上安装操作系统  
  50.     {  
  51.         std::cout <<"我有台苹果电脑..." <<std::endl;  
  52.         os->InstallOSImage( );                      // 安装操作系统的镜像  
  53.         std::cout <<std::endl;  
  54.     }  
  55.   
  56. };  
  57. #endif // __COMPUTER_H_INCLUDED__  

下面看看主程序该怎么写

  1. #include <iostream>  
  2.   
  3. #include "OS.h"  
  4. #include "Computer.h"  
  5.   
  6. using namespace std;  
  7.   
  8. int main()  
  9. {  
  10.     OS       *os = NULL;  
  11.     Computer *com = NULL;  
  12.   
  13.     os = new WindowsOS( );  
  14.     com = new DellComputer( );  
  15.     com->InstallOS(os);              // 在Dell笔记本上安装Windows操作系统  
  16.     delete os;  
  17.     os = NULL;  
  18.     delete com;  
  19.     com = NULL;  
  20.   
  21.     os = new LinuxOS( );  
  22.     com = new AcerComputer( );  
  23.     com->InstallOS(os);      // 在宏基电脑上安装Linux操作系统  
  24.     delete os;  
  25.     os = NULL;  
  26.     delete com;  
  27.     com = NULL;  
  28.   
  29.     os = new MacOS( );  
  30.     com = new AppleComputer( );  
  31.     com->InstallOS(os); // 在苹果机上安装MacOs  
  32.     delete os;  
  33.     os = NULL;  
  34.     delete com;  
  35.     com = NULL;  
  36.   
  37.     return 0;  
  38. }  

附言-另外的实现方式(组合/聚合)


另外还有一种是采用组合或者聚合的方式去实现代码部解释了直接附上
  1. #include <iostream>  
  2.   
  3. //////////////////////////////////////////////////////////////////////////////////  
  4. // 操作系统  
  5. class OS  
  6. {  
  7. public :  
  8.     virtual ~OS( ){ };  
  9.     virtual void InstallOSImage( ) const = 0;          // 安装操作系统  
  10.   
  11. };  
  12.   
  13.   
  14. // WINDOWS操作系统  
  15. class WindowsOS : public OS  
  16. {  
  17. public:  
  18.     virtual ~WindowsOS( ){  };  
  19.     void InstallOSImage( ) const  
  20.     {  
  21.         std::cout <<"安装WINDOWS操作系统" <<std::endl;  
  22.     }  
  23. };  
  24.   
  25. // LINUX操作系统  
  26. class LinuxOS : public OS  
  27. {  
  28. public:  
  29.     virtual ~LinuxOS( ){ };  
  30.     void InstallOSImage( ) const  
  31.     {  
  32.         std::cout <<"安装LINUX操作系统" <<std::endl;  
  33.     }  
  34. };  
  35.   
  36.   
  37. // MACOX操作系统  
  38. class MacOS : public OS  
  39. {  
  40. public:  
  41.     virtual ~MacOS( ){ };  
  42.     void InstallOSImage( ) const  
  43.     {  
  44.         std::cout <<"安装MACOS操作系统" <<std::endl;  
  45.     }  
  46. };  
  47. //////////////////////////////////////////////////////////////////////////////////  
  48. //  
  49. //  
  50. //  
  51. //////////////////////////////////////////////////////////////////////////////////  
  52. // 计算机的基类  
  53. class Computer  
  54. {  
  55. public :  
  56.     Computer(OS *os)  
  57.     :m_os(os)  
  58.     {  
  59.     }  
  60.   
  61.     virtual ~Computer( )  
  62.     {  
  63.     };  
  64.     virtual void InstallOS( ) = 0;          // 在计算机上安装操作系统  
  65.   
  66. protected :  
  67.     OS  *m_os;                  // 安装的操作系统  
  68. };  
  69.   
  70. // 计算机的基类  
  71. class DellComputer : public Computer  
  72. {  
  73. public :  
  74.     DellComputer(OS *os)  
  75.     :Computer(os)  
  76.     {  
  77.     }  
  78.     virtual ~DellComputer( ){ };  
  79.     void InstallOS( )          // 在计算机上安装操作系统  
  80.     {  
  81.         std::cout <<"This is a DELL computer..." <<std::endl;  
  82.         this->m_os->InstallOSImage( );                      // 安装操作系统的镜像  
  83.         std::cout <<std::endl;  
  84.     }  
  85. };  
  86.   
  87.   
  88.   
  89. // 计算机的基类  
  90. class AcerComputer : public Computer  
  91. {  
  92. public :  
  93.     AcerComputer(OS *os)  
  94.     :Computer(os)  
  95.     {  
  96.     }  
  97.     virtual ~AcerComputer( )  
  98.     {  
  99.   
  100.     }  
  101.     void InstallOS( )          // 在计算机上安装操作系统  
  102.     {  
  103.         std::cout <<"This is a ACER computer..." <<std::endl;  
  104.         this->m_os->InstallOSImage( );                      // 安装操作系统的镜像  
  105.         std::cout <<std::endl;  
  106.     }  
  107.   
  108. };  
  109.   
  110. // 计算机的基类  
  111. class AppleComputer : public Computer  
  112. {  
  113. public :  
  114.     AppleComputer(OS *os)  
  115.     :Computer(os)  
  116.     {  
  117.     }  
  118.     virtual ~AppleComputer( ){ };  
  119.     void InstallOS( )          // 在计算机上安装操作系统  
  120.     {  
  121.         std::cout <<"This is a APPLE computer..." <<std::endl;  
  122.         this->m_os->InstallOSImage( );                      // 安装操作系统的镜像  
  123.         std::cout <<std::endl;  
  124.     }  
  125.   
  126. };  
  127. //////////////////////////////////////////////////////////////////////////////////  
  128. //  
  129. //  
  130. //  
  131. //  
  132. //////////////////////////////////////////////////////////////////////////////////  
  133. int main()  
  134. {  
  135.     OS       *os = NULL;  
  136.     Computer *com = NULL;  
  137.   
  138.     os = new WindowsOS( );  
  139.     com = new DellComputer(os);  
  140.     com->InstallOS( );// Dell上安装了Windows  
  141.     delete os;  
  142.     os = NULL;  
  143.     delete com;  
  144.     com = NULL;  
  145.   
  146.     os = new LinuxOS( );  
  147.     com = new AcerComputer(os);  
  148.     com->InstallOS( );// 宏基上装了个Linux  
  149.     delete os;  
  150.     os = NULL;  
  151.     delete com;  
  152.     com = NULL;  
  153.   
  154.     os = new MacOS( );  
  155.     com = new AppleComputer(os);  // 苹果电脑上安装MACOS  
  156.     com->InstallOS( );  
  157.     delete os;  
  158.     os = NULL;  
  159.     delete com;  
  160.     com = NULL;  
  161.   
  162.     return 0;  
  163. }  


转载:http://blog.csdn.net/gatieme/article/details/17994663

目录
相关文章
|
6月前
|
设计模式 开发者
【设计模式】第七篇:和我一起简单认识桥接模式
实现的意思并不是指抽象的派生类,而是指通过组合来代替继承关系,从而降低抽象和具体实现产品两个可变换维度之间的耦合,就像我们的相机品牌和相机产品类型之间的分离
54 4
|
7月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
|
2月前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
3月前
|
设计模式 自然语言处理 算法
PHP中的设计模式:桥接模式的深入探索与应用
在PHP开发中,理解并运用设计模式是提升代码质量与可维护性的关键。本文聚焦于桥接模式——一种结构型设计模式,它通过封装一个抽象的接口,将实现与抽象分离,从而使得它们可以独立变化。不同于传统摘要的概述式表述,本文将以故事化的情境引入,逐步解析桥接模式的精髓,通过PHP代码示例详细展示其在实际项目中的应用,旨在为读者提供一个既深刻又易于理解的学习体验。
27 1
|
3月前
|
设计模式 Java
Java设计模式-桥接模式(9)
Java设计模式-桥接模式(9)
|
2月前
|
设计模式 Java
Java设计模式之桥接模式
这篇文章介绍了Java设计模式中的桥接模式,包括桥接模式的目的、实现方式,并通过具体代码示例展示了如何分离抽象与实现,使得两者可以独立变化。
44 0
|
4月前
|
设计模式 XML 存储
【七】设计模式~~~结构型模式~~~桥接模式(Java)
文章详细介绍了桥接模式(Bridge Pattern),这是一种对象结构型模式,用于将抽象部分与实现部分分离,使它们可以独立地变化。通过实际的软件开发案例,如跨平台视频播放器的设计,文章阐述了桥接模式的动机、定义、结构、优点、缺点以及适用场景,并提供了完整的代码实现和测试结果。桥接模式适用于存在两个独立变化维度的系统,可以提高系统的可扩展性和灵活性。
【七】设计模式~~~结构型模式~~~桥接模式(Java)
|
4月前
|
设计模式 缓存 项目管理
设计模式的基础问题之桥接模式在软件开发应用的问题如何解决
设计模式的基础问题之桥接模式在软件开发应用的问题如何解决
|
5月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
46 3
|
5月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
62 2