//---------------------------15/04/15----------------------------

//Bridge 桥接模式----对象结构型模式

/*

1:意图:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

2:别名:Handle

3:动机

4:适用性:

1>你不希望在抽象和它的实现部分之间有一个固定的绑定关系。比如在程序运行时刻实现部分

应该可以被选择或切换。

2>类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时,Bridge模式使你

可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3>对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。

4>你想对客户完全隐藏抽象的实现部分。在c++中,类的表示在类接口中时可见的。

5>由许多类要生成,这时要把对象分解成两个部分。

6>你想在多个对象间共享实现,但同时要求客户并不知道这一点,

5:结构:

client

|------->Abstraction:

imp----------------------------->Implementor:

Operation()                      OperationImp()

{ imp->OperationImp();}               |

|                                  |

|                     -----------------------------

RefinedAbstraction:           |                           |

ConcreteImplementorA:       ConcreteImplementorB:

OperationImp()              OperationImp()

6:参与者:

1>Abstraction:

1)定义抽象类的接口。

2)维护一个指向Implementor类型对象的指针。

2>RefinedAbstraction:

扩充由Abstraction定义的接口。

3>Implementor:

定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以

完全不同。一般来讲,Implementor接口仅提供基础操作,而Abstractor则定义了基于这些

操作的较高层次的操作。

4>ConcreteImplementor:

实现了Implementor接口并定义它的具体实现。

7:协作:

Abstraction将client的请求转发给它的Implementor对象。

8:效果:

1>分离接口及其实现部分。一个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行

配置,一个对象甚至可以在运行时刻改变它的实现。

将Abstraction与Implementor分离有助于降低对实现部分编译时刻的依赖性,当改变一个实现类

时,并不需要重新编译Abstraction类和它的客户程序。为了保证一个类库的不同版本之间的二进制

兼容性,一定要有这个性质。

另外接口和实现分离有助于分层,从而产生更好的结构化系统,系统的高层部分仅需知道Abstraction

和Implementor即可。

2>提高可扩充性。你可以独立地对Abstraction和Implementor层次结构进行扩充。

3>实现细节对客户透明。你可以对客户隐藏实现细节。

9:实现:

1>仅有一个Implementor,在仅有一个实现的时候,没有必要创建一个抽象的Implemntor类,这是

Bridge模式的退化情况;在Abstraction与Implementor之间有一种一对一的关系。尽管如此,

如果你希望改变一个类的实现不会影响已有的客户程序时,模式的分离机制还是必要的。

2>创建正确的Implementor对象。当存在多个Implementor类的时候,如何确定创建哪一个

Implementor类:

1)传递参数来选择构造相应的ConcreteImplementor类。

2)交给另外一个对象,通常是一个factory对象,向factory申请一个对象。

10:代码示例:                                                                        */

//Abstraction:定义了Window应有的接口

class Window

{

public:

Window(View* contents);

virtual
void DrawContents();

virtual
void Open();

virtual
void Close();

virtual
void Iconify();

virtual
void Deiconify();

virtual
void SetOrigin(const Point& at);

virtual
void SetExtent(const Point& extent);

virtual
void Raise();

virtual
void Lower();

virtual
void DrawLine(const Point&,const Point);

virtual
void DrawRect(const Point&,const Point);

virtual
void DrawPolygon(const Point[],int n);

virtual
void DrawText(constchar*,
const Point&);

protected:

WindowImp* GetWindowIpm();

View* GetView();

private:

Window* _imp;

View* _contexts;

};

//Implementor:定义了Implementor应有的接口

class WindowImp

{

public:

virtual
;

virtual
;

virtual
;

virtual
;

virtual
;

virtual
void DeviceText(constchar*, Coord, Coord) =
;

virtual
void DeviceBitmap(constchar*, Coord, Coord) =
;

...

protected:

WindowImp();

};

//RefinedAbstraction

class ApplicateionWindow :public Window

{

public:

virtual
void DrawContents();

...

};

void ApplicateionWindow::DrawContents()

{

GetView()->DrawOn(this);

}

//RefinedAbstraction 使用Implementor的接口来画图

class IconWindow:public Window

{

public:

virtual
void DrawContents();

...

private:

const
char* _bitmapName;

};

void IconWindow::DrawContents()

{

WindowImp* imp = GetWindowIpm();

if(imp !=
)

{

imp->DeviceBitmap(_bitmapName,0.0,
0.0);

}

}

//ConcreteImplementor  实现了底层操作。

class XwindowImp :public WindowImp

{

public:

XwindowImp();

virtual
void DeviceRect(Coord, Coord, Coord, Coord);

...

private:

Display* _dpy;

Drawable _winid;

Gc _gc;

};

//ConcreteImplementor

class PMWindowImp :public WindowImp

{

public:

PMWindowImp();

virtual
void DeviceRect(Coord, Coord, Coord, Coord);

...

private:

HPS _hps;

};

void XwindowImp::DeviceRect(Coord x0, Coord y0, Coord x1, Coord y1)

{

int x = round(min(x0, x1));

int y = round(min(y0, y1));

int w = round(abs(x0 - x1));

int h = round(abs(y0 - y1));

XDrawRectangle(_dpy, _winid, _gc, x, y, w, h);

}

void PMWindowImp::DeviceRect(Coord x0, Coord y0, Coord x1, Coord y1)

{

Coord left = min(x0, x1);

Coord right = max(x0, x1);

Coord bottom = min(y0, y1);

Coord top = max(y0, y1);

PPOINTL point[];

point[].x = left;

point[].y = top;

point[].x = right;

point[].y = top;

point[].x = right;

point[].y = bottom;

point[].x = left;

point[].y = bottom;

if(

(GpiBeginPath(_hps,L) ==
false) ||

(GpiSetCurrentPosition(_hps, &point[]) ==false) ||

(GpiPolyLine(_hps,L, point) == GPI_ERROR) ||

(GPIEndPath(_hps) ==false)

)

{

//report error;

}

else

{

GpiStrokePath(_hps,L,
L);

}

}

//使用单例模式的工厂得到WindowImp的实例。

WindowImp* Window::GetWindowIpm()

{

if(_imp ==
)

{

_imp = WindowSystemFactory::Instance()->MakeWindowImp();

}

return _imp;

}

设计模式 笔记 桥接模式 Bridge的更多相关文章

  1. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...

  2. 【设计模式】桥接模式 Bridge Pattern

    开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...

  3. python 设计模式之桥接模式 Bridge Pattern

    #写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...

  4. 二十四种设计模式:桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...

  5. [设计模式] 7 桥接模式 bridge

    #include<iostream> using namespace std; class AbstractionImp { public: virtual ~AbstractionImp ...

  6. 设计模式之桥接模式(Bridge)--结构模型

    1.意图 将抽象部分与它的实现部分分离,使它们可以独立地变化. 2.适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系. 类的抽象与它的实现都应该可以通过子类的方式加以扩展. 抽象部分与实现 ...

  7. 设计模式之桥接模式(Bridge)

    桥接模式与原理:将抽象部分与实现部分分离,使它们都可以独立的变化.最终的结果表现在实现类中.两者之间属于等价关系,即实现部分和抽象部分可以相互交换. 代码如下 #include <iostrea ...

  8. 学习笔记——桥接模式Bridge

    桥接模式的目的是在设计初,就将实现与接口分离,在以后实现发生变化时,只需要改变传递的实现对象,在保持接口一致的情况,达到实现的变更. 在OperationInterface中就调用实现的方法imp.O ...

  9. 结构型设计模式之桥接模式(Bridge)

    结构 意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. ...

随机推荐

  1. 使用 Azure Active Directory 管理 Azure 中的 HPC Pack 群集

    Microsoft HPC Pack 2016 支持在 Azure 中部署 HPC Pack 群集的管理员将其与 Azure Active Directory (Azure AD) 集成. 请按照本文 ...

  2. 使用 Azure 门户创建 Windows 虚拟机

    可以通过 Azure 门户创建 Azure 虚拟机. 此方法提供一个基于浏览器的用户界面,用于创建和配置虚拟机和所有相关的资源. 本快速入门介绍了如何创建虚拟机并在 VM 上安装 webserver. ...

  3. 根据模板导出Excel报表并复制模板生成多个Sheet页

    因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为  根据提供的模板来导出Excel报表 并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求, 使用本工具类时 ...

  4. struts2框架

    详细教程 参考struts教程https://www.w3cschool.cn/struts_2/struts_configuration.html Struts2 基于MVC设计模式的web应用程序 ...

  5. windows Server 2008R2 FTP服务器搭建详细图解

    一.安装ftp服务 1.打开服务器管理器,如图: 2.右键点击角色,如图: 3.点击添加角色,会出现添加角色向导对话框,如图: 4.点击下一步,选择要添加的“web服务器(IIS)” ‘’ 5.点击下 ...

  6. 一、JSP九大内置对象 二、JAVAEE三层架构和MVC设计模式 三、Ajax

    一.JSP九大内置对象###<1>概念 不需要预先申明和定义,可以直接在jsp代码中直接使用 在JSP转换成Servlet之后,九大对象在Servlet中的service方法中对其进行定义 ...

  7. 3.Solr4.10.3目录结构

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.整个目录结构 (1)bin:是脚本的启动目录 (2)contrib:第三方包存放的目录 (3)dist:编 ...

  8. 分享-结合demo讲解JS引擎工作原理

    代码如下: var x = 1; function A(y){ var x = 2; function B(z){ console.log(x+y+z); } return B; } var C = ...

  9. SAP跟踪前台操作导致的后台查询语句

    SAP跟踪前台操作导致的后台查询语句,通过这个可以查看前台对应了后台的数据库表,然后可以通过se11查看表内容,也可以删除表内容. 在sap升级的时候,首先需要拷贝正式的sap系统,然后将拷贝的系统中 ...

  10. [JSOI2009]球队收益

    题目 这题好神啊 我们发现一个球队的总比赛场数是确定的,设第\(i\)支球队一共进行了\(s_i\)场比赛 于是这个球队的收益就是\(c_i\times x^2+d_i(s_i-x)^2\) 我们拆开 ...