//---------------------------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. c#为字段设置默认值,以及构造函数初始化List对象。

    1.为字段设置默认值 /// <summary> /// 默认值 /// </summary> ; ; /// <summary> /// 页的大小 /// < ...

  2. 如何加密 Windows VM 上的虚拟磁盘

    为了增强虚拟机 (VM) 的安全性以及符合性,可以加密 Azure 中的虚拟磁盘. 磁盘是使用 Azure 密钥保管库中受保护的加密密钥加密的. 可以控制这些加密密钥,以及审核对它们的使用. 本文详细 ...

  3. Linux磁盘及分区之wwid和uuid

    背景描述,在Linux系统中,如果添加了新的SCSI磁盘或者映射SAN存储LUN操作,重启操作系统之后会出现磁盘标识符(sd*)错乱的情况. 例如之前添加的SAN存储LUN的磁盘标识符为/dev/sd ...

  4. wc 命令使用说明

    wc 命令 使用说明 wc 命令还是很是简单的,通过 man 命令,可以见到可以选择的选项: wc option file 并且 wc 命令支持 管道操作 其中较为常用的命令选项 -c 字符的个数 - ...

  5. SDN期末作业——负载均衡

    作业链接 期末作业 1.负载均衡程序 代码 2.演示视频 地址 3.小组分工 小组:incredible five 构建拓扑:俞鋆 编写程序:陈绍纬.周龙荣 程序调试和视频录制:陈辉.林德望 4.个人 ...

  6. Vue.js实现前段评论展示

    本来想着给这个博客弄个回复系统(类似知乎的回复),最初的实现思路是这样的:主评论后台渲染,前台新增的评论,回复用jquery操作dom放到页面上.实现的时候感觉好复杂,大量的dom操作,目前前段框架不 ...

  7. 【Java集合源代码剖析】ArrayList源代码剖析

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/35568011 转载请注明出处:http:// ...

  8. 请问下.net俱乐部这个组织现在还存在么?

    各位好,我是北京的一名.net开发人员,一直在想有什么线下技术活动可以开拓自己的视野,扩展人脉,我知道曾经有一个.net俱乐部很活跃 可是现在我在百度上搜了下.net俱乐部的信息,已经基本找不到201 ...

  9. 利用 Settings Sync 同步vs code配置

    vs code上有各种各样不同的插件,如果要在不同的电脑上使用 vs code 配置是件比较麻烦的事情,使用 Settings Sync 将 vs code 配置备份起来,当需要在其他电脑使用  vs ...

  10. Android调用相机拍照并返回路径和调用系统图库选择图片

    调用系统图库: Intent intent = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI); ...