bridge模式简要介绍.docx

上传人:知****量 文档编号:18885788 上传时间:2022-06-02 格式:DOCX 页数:18 大小:47.53KB
返回 下载 相关 举报
bridge模式简要介绍.docx_第1页
第1页 / 共18页
bridge模式简要介绍.docx_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《bridge模式简要介绍.docx》由会员分享,可在线阅读,更多相关《bridge模式简要介绍.docx(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、bridge模式1. 问题 总结面向对象实际上就两句话:一是松耦合Coupling,二是高内聚Cohesion。面向对象系统追求的目标就是尽可能地提高系统模块内部的内聚Cohesion、尽可能降低模块间的耦合Coupling。然而这也是面向对象设计过程中最为难把握的局部,大家肯定在OO系统的开发过程中遇到这样的问题:1客户给了你一个需求,于是使用一个类来实现A;2客户需求变化,有两个算法实现功能,于是改变设计,我们通过一个抽象的基类,再定义两个具体类实现两个不同的算法A1和A2;3客户又告诉我们说对于不同的操作系统,于是再抽象一个层次,作为一个抽象基类A0,在分别为每个操作系统派生具体类A00

2、和A01,其中A00表示原来的类A实现不同操作系统上的客户需求,这样我们就有了一共4个类。4可能用户的需求又有变化,比方说又有了一种新的算法.5我们陷入了一个需求变化的郁闷当中,也因此带来了类的迅速膨胀。Bridge模式那么正是解决了这类问题。2. 模式选择Bridge模式典型的结构图为: 在Bridge模式的结构图中可以看到,系统被分为两个相对独立的局部,左边是抽象局部,右边是实现局部,这两个局部可以互相独立地进行修改:例如上面问题中的客户需求变化,当用户需求需要从Abstraction派生一个具体子类时候,并不需要像上面通过继承方式实现时候需要添加子类A1和A2了。另外当上面问题中由于算法

3、添加也只用改变右边实现添加一个具体化子类,而右边不用在变化,也不用添加具体子类了。 一切都变得elegant!view plaincopy to clipboardprint?/* * 一雨田 :* * Bridge模式:将抽象局部与它的实现局部别离,使它们都可以独立地变化。 * 这句话真是很晦涩,我来解释一下。所谓的实现局部,你可以想象成一个功能库,这个库是用类来组织的, * 并且实现了你需要的功能,而抽象局部就是使用这个库的类。 * 让他们独立变化的意思就是说,库增加或者使用库的代码改变都是在两边独立变化的,不影响另一边 * 就好似隔了个桥梁一样,如果你理解了,就会觉得BRIDGE这个名字

4、改得真好。 * 好了,如果不明白也没关系,先看看下面的代码。应该能明白的 */ /* * 任务表达:我们现在要实现一个画图系统,这个系统的需求暂时来说有以下几个: * 1、画圆、画长方形。(先实现画这两个形状) * 2、已经有两个画图库了,这些画图库中定义了我们需要的操作,我们没必要重新去实现了 * 3、我们的系统能够决定使用哪个的画图库中的操作 * 根据以上的需求,我们的代码设计如下(这里先不使用Bridge模式,以便比照) : */ /* * 注意,这里使用了个预编译宏 _BRIDGE_MODE 来隔开使用Bridge和不使用Bridge两块代码。可以以这个来做分界比照看 * 两局部的代码

5、 */ #include #include using namespace std; / 把这里注释掉就是不使用Bridge模式的代码 #define _BRIDGE_MODE / 画图库1 class CDrawLib1 public: void DrawCircle() cout 画圆操作1 endl; void DrawRectangle() cout 画长方形操作1 endl; void DrawTriangle() cout 画三角形操作1 endl; ; / 画图库2 class CDrawLib2 public: void DrawCircle() cout 画圆操作2 endl

6、; void DrawRectangle() cout 画长方形操作2 endl; void DrawTriangle() cout 画三角形操作2 endl; ; / 只要声明 _BRIDGE_MODE 就可以在使用或者不使用Bridge模式间切换了 #ifndef _BRIDGE_MODE/不使用桥模式代码 / 看到形状,很容易想到经典的Shape抽象类,并定义一个Draw接口 / 这里1代表使用画图库1的画图操作 class CShape1 public: virtual void Draw() = 0; protected: CDrawLib1 _drawLib; ; / 画圆和画长方

7、形,好,这里就派生出两个形状 class CCircle1: public CShape1 public: / 实现Draw操作,使用画图库1 virtual void Draw() / 使用画图库1 _drawLib.DrawCircle(); ; class CRectangle1: public CShape1 public: / 实现Draw操作,但是要使用画图库1 virtual void Draw() / 使用画图库1 _drawLib.DrawRectangle(); ; / 再定义使用画图库2的Shape class CShape2 public: virtual void D

8、raw() = 0; protected: CDrawLib2 _drawLib; ; / 画圆和画长方形,好,这里就派生出两个形状 class CCircle2: public CShape2 public: / 实现Draw操作,使用画图库2 virtual void Draw() / 使用画图库2 _drawLib.DrawCircle(); ; class CRectangle2: public CShape2 public: / 实现Draw操作,但是要使用画图库2 virtual void Draw() / 使用画图库2 _drawLib.DrawRectangle(); ; vo

9、id Draw1(CShape1 &s) s.Draw(); void Draw2(CShape2 &s) s.Draw(); / 好了,我们开始使用上面的类来实现我们的画图系统 void main() cout 不使用Bridge模式 DrawCircle(); ; class CRectangle: public CShape public: CRectangle(CShapeImp *imp) _sImp = imp; virtual void Draw() _sImp-DrawRectangle(); ; / 好了,我们利用上面的类结构来实现我们的画图系统 void main() co

10、ut 使用Bridge模式 endl; CShapeImp1 sImp1; CShapeImp2 sImp2; / 使用画图库1 CCircle c1(&sImp1); CRectangle r1(&sImp1); c1.Draw(); r1.Draw(); / 使用画图库2 CCircle c2(&sImp2); CRectangle r2(&sImp2); c2.Draw(); r2.Draw(); /* * 好的,上述的代码运行正常,并且维护也方便了,回想一下上面的两个新需求: * 1、出现了第三个库 * 2、画图系统需要画三角形 * 考虑一下,对于第一个需求,我们只需要再增加一个Sha

11、peImp就可以了。 * 再看第二个需求,我们也是只需要派生一个CTriangle就可以了 * 可以看出来,变化不再造成混乱,只需要单独针对变化改动代码就行了。 * 也就是,变化被Bridge给分开了。 */ /* * 对于这个的模式学习,个人推荐自己写写代码,感受一下使用Bridge和不使用的前后差异, * 应该也会很快搞定它的。 */ #endif /* Bridge模式:将抽象局部与它的实现局部别离,使它们都可以独立地变化。* 这句话真是很晦涩,我来解释一下。所谓的实现局部,你可以想象成一个功能库,这个库是用类来组织的,* 并且实现了你需要的功能,而抽象局部就是使用这个库的类。* 让他们

12、独立变化的意思就是说,库增加或者使用库的代码改变都是在两边独立变化的,不影响另一边* 就好似隔了个桥梁一样,如果你理解了,就会觉得BRIDGE这个名字改得真好。* 好了,如果不明白也没关系,先看看下面的代码。应该能明白的*/* 任务表达:我们现在要实现一个画图系统,这个系统的需求暂时来说有以下几个:* 1、画圆、画长方形。(先实现画这两个形状) * 2、已经有两个画图库了,这些画图库中定义了我们需要的操作,我们没必要重新去实现了* 3、我们的系统能够决定使用哪个的画图库中的操作* 根据以上的需求,我们的代码设计如下(这里先不使用Bridge模式,以便比照) :*/* 注意,这里使用了个预编译宏

13、 _BRIDGE_MODE 来隔开使用Bridge和不使用Bridge两块代码。可以以这个来做分界比照看* 两局部的代码*/#include #include using namespace std;/ 把这里注释掉就是不使用Bridge模式的代码#define _BRIDGE_MODE/ 画图库1class CDrawLib1public:void DrawCircle()cout 画圆操作1 endl;void DrawRectangle()cout 画长方形操作1 endl;void DrawTriangle()cout 画三角形操作1 endl;/ 画图库2class CDrawLib

14、2public:void DrawCircle()cout 画圆操作2 endl;void DrawRectangle()cout 画长方形操作2 endl;void DrawTriangle()cout 画三角形操作2 endl;/ 只要声明 _BRIDGE_MODE 就可以在使用或者不使用Bridge模式间切换了#ifndef _BRIDGE_MODE/不使用桥模式代码/ 看到形状,很容易想到经典的Shape抽象类,并定义一个Draw接口/ 这里1代表使用画图库1的画图操作class CShape1public:virtual void Draw() = 0;protected:CDraw

15、Lib1 _drawLib;/ 画圆和画长方形,好,这里就派生出两个形状class CCircle1: public CShape1public:/ 实现Draw操作,使用画图库1virtual void Draw()/ 使用画图库1_drawLib.DrawCircle();class CRectangle1: public CShape1public:/ 实现Draw操作,但是要使用画图库1virtual void Draw()/ 使用画图库1_drawLib.DrawRectangle();/ 再定义使用画图库2的Shapeclass CShape2public:virtual void

16、 Draw() = 0;protected:CDrawLib2 _drawLib;/ 画圆和画长方形,好,这里就派生出两个形状class CCircle2: public CShape2public:/ 实现Draw操作,使用画图库2virtual void Draw()/ 使用画图库2_drawLib.DrawCircle();class CRectangle2: public CShape2public:/ 实现Draw操作,但是要使用画图库2virtual void Draw()/ 使用画图库2_drawLib.DrawRectangle();void Draw1(CShape1 &s)

17、s.Draw();void Draw2(CShape2 &s)s.Draw();/ 好了,我们开始使用上面的类来实现我们的画图系统void main()cout 不使用Bridge模式 DrawCircle();class CRectangle: public CShapepublic:CRectangle(CShapeImp *imp)_sImp = imp;virtual void Draw()_sImp-DrawRectangle();/ 好了,我们利用上面的类结构来实现我们的画图系统void main()cout 使用Bridge模式 endl;CShapeImp1 sImp1;CSh

18、apeImp2 sImp2;/ 使用画图库1CCircle c1(&sImp1);CRectangle r1(&sImp1);c1.Draw();r1.Draw();/ 使用画图库2CCircle c2(&sImp2);CRectangle r2(&sImp2);c2.Draw();r2.Draw();/* 好的,上述的代码运行正常,并且维护也方便了,回想一下上面的两个新需求:* 1、出现了第三个库* 2、画图系统需要画三角形* 考虑一下,对于第一个需求,我们只需要再增加一个ShapeImp就可以了。* 再看第二个需求,我们也是只需要派生一个CTriangle就可以了* 可以看出来,变化不再造

19、成混乱,只需要单独针对变化改动代码就行了。* 也就是,变化被Bridge给分开了。*/* 对于这个的模式学习,个人推荐自己写写代码,感受一下使用Bridge和不使用的前后差异,* 应该也会很快搞定它的。*/#endif view plaincopy to clipboardprint?#include using namespace std; / 软件 class HandsetSoft public: virtual void Run()=0; ; /游戏软件 class HandsetGame : public HandsetSoft public: virtual void Run()

20、cout运行 游戏endl; ; /通讯录软件 class HandSetAddressList : public HandsetSoft public: virtual void Run() cout 通讯录Run(); ; /N品牌 class HandsetBrandN : public HandsetBrand public: virtual void Run() m_soft-Run(); ; /客户端 int main() HandsetBrand *brand; brand = new HandsetBrandM(); brand-SetHandsetSoft(new Hands

21、etGame(); brand-Run(); brand-SetHandsetSoft(new HandSetAddressList(); brand-Run(); return 0; #include using namespace std;/ 软件class HandsetSoftpublic:virtual void Run()=0;/游戏软件class HandsetGame : public HandsetSoftpublic:virtual void Run()cout运行 游戏endl;/通讯录软件class HandSetAddressList : public HandsetSoftpublic:virtual void Run()cout 通讯录endl;/ 品牌class HandsetBrandprotected:HandsetSoft* m_soft;public:void SetHandsetSoft(HandsetSoft

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作计划

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁