桥接模式PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
桥接模式
教学内容
桥接模式
✓ 模式动机与定义 ✓ 模式结构与分析 ✓ 模式实例与解析 ✓ 模式效果与应用 ✓ 模式扩展
桥接模式
模式动机
✓ 设想如果要绘制矩形、圆形、椭圆、正方形,我们至少 需要4个形状类,但是如果绘制的图形需要具有不同的 颜色,如红色、绿色、蓝色等,此时至少有如下两种设 计方案:
桥接模式
模式结构
Client
Abstraction
impl
+ operation () ...
Implementor
+ operationImpl () ...
RefinedAbstraction
+ operation () ...
ConcreteImplementorA
+ operationImpl () ...
传统的做法:
通过类继承的方式来做上面的例子,先看一下 类结构图:
缺点:
但是我们说这样的设计是脆弱的,仔细分析就可以发现 ,它还是存在很多问题,首先它在遵循开放-封闭原则的同 时,违背了类的单一职责原则,即一个类只有一个引起它 变化的原因,而这里引起变化的原因却有两个,即路类型 的变化和汽车类型的变化;其次是重复代码会很多,不同 的汽车在不同的路上行驶也会有一部分的代码是相同的; 再次是类的结构过于复杂,继承关系太多,难于维护,最 后最致命的一点是扩展性太差。如果变化沿着汽车的类型 和不同的道路两个方向变化,我们会看到这个类的结构会 迅速的变庞大。
桥接模式
模式动机
生活中的一个例子
就拿汽车在路上行驶的来说。即有小汽车又有 公共汽车,它们都不但能在市区中的公路上行驶, 也能在高速公路上行驶。这你会发现,对于交通工 具(汽车)有不同的类型,然而它们所行驶的环境 (路)也在变化,在软件系统中就要适应两个方面 的变化?怎样实现才能应对这种变化呢?
• 实现化:针对抽象化给出的具体实现,就是实现化,抽象化与实现 化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽 象化事物的进一步具体化的产物。
• 脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将 它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为 关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象 化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关 系,从而使两者可以相对独立地变化,这就是桥接模式的用意。
SmallPen
BigPen
+ draw (String name) : void + draw (String name) : void
...
...
MiddlePen
+ draw (String name) : void ...
Red
+ bepaint (String penType, String name) : void ... Green
应用设计模式
桥接模式(Bridge)来做,先看一下类结 构图:
可以看到,通过对象组合的方式,Bridge 模式把两个角色之间的
继承关系改为了耦合的关系,从而使这两者可以从容自若的各自独立
的变化,这也是Bridge模式的本意。
这样增加了客户程序与路与汽车的耦合。其实这样的担心是没有
百度文库
必要的,因为这种耦合性是由于对象的创建所带来的,完全可以用创
建型模式去解决。在应用时结合创建型设计模式来处理具体的问题。
应用设计模式:
桥接模式(Bridge)来做(多维度变化);
结合上面的例子,增加一个维度"人",不同的人开着不同的汽车在
不同的路上行驶(三个维度);
结合上面增加一个类"人",并重新调用?
桥接模式
模式定义
✓ 桥接模式(Bridge Pattern):将抽象部分与它的实现部 分分离,使它们都可以独立地变化。它是一种对象结构 型模式,又称为柄体(Handle and Body)模式或接口 (Interface)模式。
桥接模式
桥接模式实例与解析
✓ 实例一:模拟毛笔
Pen {abstract}
# color : Color
+ setColor (Color color) : void + draw (String name) : void
...
color
Color
+ bepaint (String penType, String name) : void ...
桥接模式
桥接模式实例与解析
✓ 实例一:模拟毛笔 • 现需要提供大中小3种型号的画笔,能够绘制5种不 同颜色,如果使用蜡笔,我们需要准备3*5=15支 蜡笔,也就是说必须准备15个具体的蜡笔类。而如 果使用毛笔的话,只需要3种型号的毛笔,外加5个 颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。 本实例使用桥接模式来模拟毛笔的使用过程。
桥接模式
模式分析
✓ 理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化 (Implementation)脱耦,使得二者可以独立地变化。 • 抽象化:抽象化就是忽略一些信息,把不同的实体当作同样的实体 对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即 为抽象化的过程。
ConcreteImplementorB
+ operationImpl () ...
桥接模式
模式结构
✓ 桥接模式包含如下角色: • Abstraction:抽象类 • RefinedAbstraction:扩充抽象类 • Implementor:实现类接口 • ConcreteImplementor:具体实现类
+ bepaint (String penType, String name) : void ... Blue
+ bepaint (String penType, String name) : void ... White
• 第一种设计方案是为每一种形状都提供一套各种颜色的版本。 • 第二种设计方案是根据实际需要对形状和颜色进行组合。
桥接模式
模式动机
2
1
桥接模式
模式动机
✓对于有两个变化维度(即两个变化的原因)的 系统,采用方案二来进行设计系统中类的个数 更少,且系统扩展更为方便。设计方案二即是 桥接模式的应用。桥接模式将继承关系转换为 关联关系,从而降低了类与类之间的耦合,减 少了代码编写量。
教学内容
桥接模式
✓ 模式动机与定义 ✓ 模式结构与分析 ✓ 模式实例与解析 ✓ 模式效果与应用 ✓ 模式扩展
桥接模式
模式动机
✓ 设想如果要绘制矩形、圆形、椭圆、正方形,我们至少 需要4个形状类,但是如果绘制的图形需要具有不同的 颜色,如红色、绿色、蓝色等,此时至少有如下两种设 计方案:
桥接模式
模式结构
Client
Abstraction
impl
+ operation () ...
Implementor
+ operationImpl () ...
RefinedAbstraction
+ operation () ...
ConcreteImplementorA
+ operationImpl () ...
传统的做法:
通过类继承的方式来做上面的例子,先看一下 类结构图:
缺点:
但是我们说这样的设计是脆弱的,仔细分析就可以发现 ,它还是存在很多问题,首先它在遵循开放-封闭原则的同 时,违背了类的单一职责原则,即一个类只有一个引起它 变化的原因,而这里引起变化的原因却有两个,即路类型 的变化和汽车类型的变化;其次是重复代码会很多,不同 的汽车在不同的路上行驶也会有一部分的代码是相同的; 再次是类的结构过于复杂,继承关系太多,难于维护,最 后最致命的一点是扩展性太差。如果变化沿着汽车的类型 和不同的道路两个方向变化,我们会看到这个类的结构会 迅速的变庞大。
桥接模式
模式动机
生活中的一个例子
就拿汽车在路上行驶的来说。即有小汽车又有 公共汽车,它们都不但能在市区中的公路上行驶, 也能在高速公路上行驶。这你会发现,对于交通工 具(汽车)有不同的类型,然而它们所行驶的环境 (路)也在变化,在软件系统中就要适应两个方面 的变化?怎样实现才能应对这种变化呢?
• 实现化:针对抽象化给出的具体实现,就是实现化,抽象化与实现 化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽 象化事物的进一步具体化的产物。
• 脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将 它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为 关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象 化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关 系,从而使两者可以相对独立地变化,这就是桥接模式的用意。
SmallPen
BigPen
+ draw (String name) : void + draw (String name) : void
...
...
MiddlePen
+ draw (String name) : void ...
Red
+ bepaint (String penType, String name) : void ... Green
应用设计模式
桥接模式(Bridge)来做,先看一下类结 构图:
可以看到,通过对象组合的方式,Bridge 模式把两个角色之间的
继承关系改为了耦合的关系,从而使这两者可以从容自若的各自独立
的变化,这也是Bridge模式的本意。
这样增加了客户程序与路与汽车的耦合。其实这样的担心是没有
百度文库
必要的,因为这种耦合性是由于对象的创建所带来的,完全可以用创
建型模式去解决。在应用时结合创建型设计模式来处理具体的问题。
应用设计模式:
桥接模式(Bridge)来做(多维度变化);
结合上面的例子,增加一个维度"人",不同的人开着不同的汽车在
不同的路上行驶(三个维度);
结合上面增加一个类"人",并重新调用?
桥接模式
模式定义
✓ 桥接模式(Bridge Pattern):将抽象部分与它的实现部 分分离,使它们都可以独立地变化。它是一种对象结构 型模式,又称为柄体(Handle and Body)模式或接口 (Interface)模式。
桥接模式
桥接模式实例与解析
✓ 实例一:模拟毛笔
Pen {abstract}
# color : Color
+ setColor (Color color) : void + draw (String name) : void
...
color
Color
+ bepaint (String penType, String name) : void ...
桥接模式
桥接模式实例与解析
✓ 实例一:模拟毛笔 • 现需要提供大中小3种型号的画笔,能够绘制5种不 同颜色,如果使用蜡笔,我们需要准备3*5=15支 蜡笔,也就是说必须准备15个具体的蜡笔类。而如 果使用毛笔的话,只需要3种型号的毛笔,外加5个 颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。 本实例使用桥接模式来模拟毛笔的使用过程。
桥接模式
模式分析
✓ 理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化 (Implementation)脱耦,使得二者可以独立地变化。 • 抽象化:抽象化就是忽略一些信息,把不同的实体当作同样的实体 对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即 为抽象化的过程。
ConcreteImplementorB
+ operationImpl () ...
桥接模式
模式结构
✓ 桥接模式包含如下角色: • Abstraction:抽象类 • RefinedAbstraction:扩充抽象类 • Implementor:实现类接口 • ConcreteImplementor:具体实现类
+ bepaint (String penType, String name) : void ... Blue
+ bepaint (String penType, String name) : void ... White
• 第一种设计方案是为每一种形状都提供一套各种颜色的版本。 • 第二种设计方案是根据实际需要对形状和颜色进行组合。
桥接模式
模式动机
2
1
桥接模式
模式动机
✓对于有两个变化维度(即两个变化的原因)的 系统,采用方案二来进行设计系统中类的个数 更少,且系统扩展更为方便。设计方案二即是 桥接模式的应用。桥接模式将继承关系转换为 关联关系,从而降低了类与类之间的耦合,减 少了代码编写量。