Bridge桥接模式.ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
virtual void Open(); virtual void Close(); virtual void Iconify(); virtual void Deiconify();
// requests forwarded to implementation virtual void SetOrigin(const Point& at); virtual void SetExtent(const Point& extent); virtual void Raise(); virtual void模式定义 模式结构 模式的程序表示C++ 模式的程序表示Java 实例与解析 模式效果评价 模式的适用环境 模式扩展 已知应用 模式小结
Bridge-桥接:动机
考虑在一个用户界面工具箱中,一个可移植的 Window抽象部分的实现。假如采用继承机制有两个 不足之处:
桥接模式(Bridge Pattern):将抽象部分与它的 实现部分分离,使它们都可以独立地变化。它 是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
Bridge-桥接:结构
Abstraction(Window) —定义抽象类的接口。 —维护一个指向Implementor类型对象的指针。
virtual void DrawLine(const Point&, const Point&); virtual void DrawRect(const Point&, const Point&); virtual void DrawPolygon(const Point[], int n); virtual void DrawText(const char*, const Point&);
Bridge-桥接:程序表示C++
class Window { public:
Window(View* contents);
// requests handled by window virtual void DrawContents();
class WindowImp { public:
virtual void ImpTop() = 0; virtual void ImpBottom() = 0; virtual void ImpSetExtent(const Point&) = 0; virtual void ImpSetOrigin(const Point&) = 0;
protected: WindowImp* GetWindowImp(); View* GetView();
private: WindowImp* _imp; View* _contents; // the window's contents
};
void Window::DrawRect (const Point& p1, const Point& p2) { WindowImp* imp = GetWindowImp(); imp->DeviceRect(p1.X(), p1.Y(), p2.X(), p2.Y());
(1)扩展Window抽象使之适用于不同种类的窗口或新的系统平台很不 方便。
(2)继承机制使得客户代码与平台相关。
1
Bridge-桥接:动机
Bridge模式解决以上问题的方法是,将Window抽象和它的实现部 分分别放在独立的类层次结构中。其中一个类层次结构针对窗口 接口(Window、IconWindow、TransientWindow),另外一个独 立的类层次结构针对平台相关的窗口实现部分,这个类层次结构 的根类为WindowImp。
2
Bridge-桥接:动机
2 1
Bridge-桥接:动机
对于有两个变化维度(即两个变化的原 因)的系统,采用方案二来进行设计系 统中类的个数更少,且系统扩展更为方 便。设计方案二即是桥接模式的应用。 桥接模式将继承关系转换为聚合关系, 从而降低了类与类之间的耦合,减少了 代码编写量。
Bridge-桥接:定义
virtual void DeviceRect(Coord, Coord, Coord, Coord) = 0; virtual void DeviceText(const char*, Coord, Coord) = 0; virtual void DeviceBitmap(const char*, Coord, Coord) = 0; // lots more functions for drawing on windows... protected: WindowImp(); };
• 实现化:针对抽象化给出的具体实现,就是实现化,抽象 化与实现化是一对互逆的概念,实现化产生的对象比抽象 化更具体,是对抽象化事物的进一步具体化的产物。
• 脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或 者说是将它们之间的强关联改换成弱关联,将两个角色之 间的继承关系改为关联关系。桥接模式中的所谓脱耦,就 是指在一个软件系统的抽象化和实现化之间使用关联关系 (组合或者聚合关系)而不是继承关系,从而使两者可以 相对独立地变化,这就是桥接模式的用意。
RefinedAbstraction(IconWindow) —扩充由Abstraction定义的接口。
Bridge-桥接:结构
Implementor(WindowImp) —定义实现类的接口,该接口不一定要与Abstraction的接口完全 一致;事实上这两个接口可以完全不同。一般来讲,Implementor 接口仅提供基本操作,而Abstraction则定义了基于这些基本操作 的较高层次的操作。
ConcreteImplementor(XwindowImp,PMWindowImp) —实现Implementor接口并定义它的具体实现。
Bridge-桥接:结构
理解桥接模式,重点需要理解如何将抽象化(Abstraction)与 实现化(Implementation)脱耦,使得二者可以独立地变化。 • 抽象化:抽象化就是忽略一些信息,把不同的实体当作同 样的实体对待。在面向对象中,将对象的共同性质抽取出 来形成类的过程即为抽象化的过程。