设计模式 笔记 桥接模式 Bridge
//---------------------------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的更多相关文章
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- python 设计模式之桥接模式 Bridge Pattern
#写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
- [设计模式] 7 桥接模式 bridge
#include<iostream> using namespace std; class AbstractionImp { public: virtual ~AbstractionImp ...
- 设计模式之桥接模式(Bridge)--结构模型
1.意图 将抽象部分与它的实现部分分离,使它们可以独立地变化. 2.适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系. 类的抽象与它的实现都应该可以通过子类的方式加以扩展. 抽象部分与实现 ...
- 设计模式之桥接模式(Bridge)
桥接模式与原理:将抽象部分与实现部分分离,使它们都可以独立的变化.最终的结果表现在实现类中.两者之间属于等价关系,即实现部分和抽象部分可以相互交换. 代码如下 #include <iostrea ...
- 学习笔记——桥接模式Bridge
桥接模式的目的是在设计初,就将实现与接口分离,在以后实现发生变化时,只需要改变传递的实现对象,在保持接口一致的情况,达到实现的变更. 在OperationInterface中就调用实现的方法imp.O ...
- 结构型设计模式之桥接模式(Bridge)
结构 意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. ...
随机推荐
- ubuntu下编译qt5
编译步骤参考: http://doc.qt.io/qt-5/linux.html 我们使用源代码和编译目录分离的编译方式, 这样避免编译主机系统和目标系统间的独立. 参考: Qt Configure ...
- jboss-as- 7.1.1.Final配置jndi数据源
初次使用jboss7.1.1.final部署项目,遇到了很多困难,最终通过查看官方文档和网上资料得以解决,特此记录一下. error information 2016-05-12 12:53:20 J ...
- jboss eap6.1(4)(部署应用)
1.添加应用war包 手动部署,添加war包到standalone\deployments下,手工创建一个文件,如war包名称是a.war,创建一个a.war.deployed文件,内容随意. 2. ...
- PowerDesigner Code和Name设置大写tablespace设置,PK设置
1,PowerDesigner Code和Name设置大写 tool>MODEL OPTIONS 2.从oracle数据库导出的表结构默认包含了tablespace 删除tablespace方法 ...
- shell變量和數組
我們要知道shell是一個很重要的腳本能幫助我們完成很多事情 shell語言其實和很多的語言的語法是差不多的 變量: 變量的定義很簡單的,但是等號兩邊是不可以有空格的(不能有空格) 命名只能使用英文字 ...
- 数据仓库四个特点(面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant))
1.面向主题. 数据仓库中的数据是按照一定的主题域进行组织. 主题是一个抽象的概念,是指用户使用数据仓库进行决策时所关心的重点方面,一个主题通常与多个操作型信息系统相关.而操作型数据库的数据组织面向事 ...
- [IDEA_6] IDEA 集成 Python
0. 说明 在 IDEA 中集成 Python 1. IDEA 集成 Python 1.1 Ctrl + Alt + S 进入设置 依次选中 Settings --> Plugins -- ...
- November 11th, 2017 Week 45th Saturday
Happiness is a direction, not a place. 快乐是一个方向,不是一个目的. Do you remember those moments in your life wh ...
- Google常用脚本
1.Tampermonkey 可下载常用脚本:https://greasyfork.org/zh-CN 2.常用FQSetupVPN 3.百度药丸屏蔽广告 4.百度文档可粘贴,下载 5.VIP视频可看
- Alpha冲刺&总结报告(12/12)(麻瓜制造者)
各个成员今日完成的任务 邓弘立: 完成了上传头像的功能 符天愉: 对所有接口进行了再次测试 江郑: 完成了发布需求接口部分的进一步测试和接口文档的编写 刘双玉: 完成了商品信息接口部分的进一步测试和接 ...