- 浏览: 173108 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lgh1992314:
String.intern()在全局常量池1.8在native ...
Java 内存模型 -
lgh1992314:
try with resource
Java GC的过程 -
lgh1992314:
JDK8 HotSpot 方法区在MetaSpace
Java 内存模型 -
空城回转:
永洁童心 写道最后的图中,在afterload_1步骤中,op ...
栈帧、局部变量表、操作数栈 -
永洁童心:
最后的图中,在afterload_1步骤中,operand s ...
栈帧、局部变量表、操作数栈
1.定义
将抽象和实现解耦,使得两者可以独立地变化
2.例子
定义看不明白?没关系,我将通过下面这个例子来阐述桥梁的概念。
小时候我们都用蜡笔画画,一盒蜡笔12种颜色。一开始我都是用最小号的蜡笔画个太阳公公、月亮婆婆足够了。后来开始画一些抽象派的作品,就得换中号的了,要不然画个背景都要描半天,好一盒中号的也是12种颜色。再后来我开始转向豪放派,中号就有些捉襟见肘了,只好换大号的了,好一盒大号的也只有12种颜色。你看,像我这样不太出名的画家就需要36种画笔,哇,太麻烦了。但是据我观察,另一些比我出名的画家倒是没有这么多笔,他们只有几把刷子和一些颜料,这样就解决了蜡笔的“种类爆炸”问题。”
==========================================================
呵呵,您是不是已经看出来了,不错,我今天要说的就是Bridge模式。为了一幅画,我们需要准备36支型号不同的蜡笔,而改用毛笔三支就够了,当然还要搭配上12种颜料。通过Bridge模式,我们把乘法运算3×12=36改为了加法运算3+12=15,这一改进可不小。那么我们这里蜡笔和毛笔到底有什么区别呢?
实际上,蜡笔和毛笔的关键一个区别就在于笔和颜色是否能够分离。【GOF95】桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。关键就在于能否脱耦。蜡笔的颜色和蜡笔本身是分不开的,所以就造成必须使用36支色彩、大小各异的蜡笔来绘制图画。而毛笔与颜料能够很好的脱耦,各自独立变化,便简化了操作。在这里,抽象层面的概念是:"毛笔用颜料作画",而在实现时,毛笔有大中小三号,颜料有红绿蓝等12种,于是便可出现3×12种组合。每个参与者(毛笔与颜料)都可以在自己的自由度上随意转换。
蜡笔由于无法将笔与颜色分离,造成笔与颜色两个自由度无法单独变化,使得只有创建36种对象才能完成任务。Bridge模式将继承关系转换为组合关系,从而降低了系统间的耦合,减少了代码编写量。
桥梁模式是一种非常简单的模式,它只是使用了类间的聚合关系、继承、重写等常用功能,但是它却提供了一个非常清晰、稳定的架构。
下面还有个小例子:
====================================================
3.桥梁模式的使用场景
- 不希望或不适合使用继承的场景:例如继承层次过渡、无法更细化设计颗粒等场景,需要考虑使用桥梁模式
- 接口或抽象类不稳定的场景:明知道接口不稳定还想通过实现或继承来实现业务需求,那是得不偿失的,也是比较失败的做法
- 重用性要求比较高的场景:设计的颗粒度越细,则被重阳的可能性越大,而采用继承则受父类的限制,不可能出现太细的颗粒度
4.桥梁模式的四个角色
- Abstraction-抽象化角色(上图中的毛笔):它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
- Implementor-实现化角色(上图中的颜料):它是接口或者抽象类,定义角色必须的行为和属性。
- RefinedAbstraction-修正抽象化角色:它引用实现化角色对抽象化角色进行修改。
- ConcreteImplementor-具体实现化角色:它实现接口或抽象类定义的方法和属性。
下面是它们的类图:
5.桥梁模式的通用代码
package _23BridgePattern; /** * 实现化角色 * (颜料) */ public interface Implementor { // 基本方法 // 画图 public void paint(); // 提名 public void title(); }
package _23BridgePattern; /** * 具体实现化角色 * (假装红颜料) */ public class ConcreteImplementor1 implements Implementor { @Override public void paint() { System.out.println("使用红色颜料画画"); } @Override public void title() { System.out.println("使用红色颜料提名"); } }
package _23BridgePattern; /** * 具体实现化角色 * (假装蓝颜料) */ public class ConcreteImplementor2 implements Implementor { @Override public void paint() { System.out.println("使用蓝色颜料画画"); } @Override public void title() { System.out.println("使用蓝色颜料提名"); } }
package _23BridgePattern; /** * 抽象化角色 * (假装毛笔) */ public abstract class Abstraction { // 定义对实现化角色的引用 private Implementor implementor; // 约束子类必须实现该构造函数 public Abstraction(Implementor implementor) { this.implementor = implementor; } // 自身的行为和属性 public void paint() { this.implementor.paint(); } public Implementor getImplementor() { return implementor; } }
package _23BridgePattern; /** * 具体抽象化角色 * (假装小号毛笔) * */ public class RefinedAbstraction extends Abstraction { public RefinedAbstraction(Implementor implementor) { super(implementor); } // 修正父类的行为 @Override public void paint() { super.paint(); super.getImplementor().title(); } }
package _23BridgePattern; /** * 场景类 */ public class Client { public static void main(String[] args) { // 定义一个实现化角色(颜料) // 还可以定义别的颜色 Implementor implementor = new ConcreteImplementor1(); // 定义一个抽象化角色(毛笔) // 还可以定义别的大小的毛笔 Abstraction abstraction = new RefinedAbstraction(implementor); // 执行(画画),这样你画画就不需要36支笔了,只需要三支笔,12种颜料就行了 abstraction.paint(); } }
6.桥梁模式的优点
- 抽象和实现分离:这也是桥梁模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式。在该模式下,实现可以完全不受抽象的约束,不用再绑定在一个固定的抽象上。
- 优秀的扩展能力:看看我们的例子,想增加毛笔大小和颜料色彩都完全没问题,我们已经把变化的可能性减到了最小。
- 实现细节对客户透明:客户不必关心细节的实现,它已经由抽象层通过聚合完成了封装。
7.桥梁模式的注意事项
- 桥梁模式是非常简单的,使用该模式时,主要考虑如何拆分抽象和实现,并不是一涉及继承就要考虑桥梁模式,那还要继承干什么呢?桥梁模式的意图是对变化的封装,尽量把可能变化的因素封装到最细、最小的逻辑单元中,避免风险扩散。
- 桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
发表评论
-
设计模式代码-仅供参考
2012-11-26 17:13 825学完设计模式,示例代码保存着,以后看看。 -
22.享元模式(Flyweight Pattern)
2012-11-26 14:55 14231.定义 使用共享对象可有效地支持大量的细粒度的对象。 是 ... -
21.解析器模式(Interpreter Pattern)
2012-11-23 14:29 45471.定义 给定一门语言,定义它的文法的一种表示,并定义一个解 ... -
20.状态模式(State Pattern)
2012-11-22 14:02 13141.定义 当一个对象内在状态改变时,允许其改变行为,这个对象 ... -
19.访问者模式(Visitor Pattern)
2012-11-19 16:28 1943话说有一个银行,有三 ... -
18.备忘录模式(Memento Pattern)
2012-11-16 15:01 1071引子 俗话说:世上难 ... -
17.门面模式(FacadePattern)
2012-11-15 15:23 10481.定义 要求一个子系统 ... -
16.观察者模式(ObserverPattern)
2012-11-14 16:08 15571.定义 定义对象之间一种一对多的依赖关系,使得每当一个对象 ... -
15.组合模式(Composite Pattern)
2012-11-13 17:35 18061.定义 将对象组合成树形结构以表示“部分-整体”的层次结构 ... -
14.迭代器模式(Iterator Pattern)
2012-11-13 14:27 11821.定义 提供一种方法访 ... -
13.适配器模式(Adapter Pattern)
2012-11-12 17:24 13551.定义 将一个类的接口变换成客户端所期待的另一种接口,从而 ... -
12.策略模式(Strategy Pattern)
2012-11-12 13:51 11281.定义 定义一组算法,将每个算法都封装起来,并且使它们之间 ... -
11.装饰模式(Decorator Pattern)
2012-11-08 15:57 10561.定义 动态地给一个对 ... -
10.责任链模式(Chain of Responsibility)
2012-11-07 16:15 10621.定义: 使多个对象都有机会处理请求,从而避免了请求的发送 ... -
9.命令模式(Command Pattern)
2012-11-07 14:45 10111.定义 将一个请求封装 ... -
8.中介者模式(Mediator Pattern)
2012-11-01 15:57 15291.定义: 用一个中介对象封装一系列的对象交互,中介者使个对 ... -
7.原型模式(Prototype Pattern)
2012-11-01 10:54 13371.定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原 ... -
6.代理模式(Proxy Pattern)
2012-10-30 16:09 11361.定义: 为其他对象提供一种代理以控制这个对象的访问。 ... -
5.建造者模式(Builder Pattern)
2012-10-26 17:06 10331.定义: 将一个复杂对象的构建与它的表示分离,使得同样的构 ... -
4.模板方法模式(Template Method Pattern)
2012-10-25 16:33 1167定义: 定义一个操作中的算法的框架,而将一些步骤延迟到 ...
相关推荐
桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板...
桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型: 13. 模板方法...
桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板...
7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型 ...
桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy ...
1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) ...16. 桥接模式 (Bridge Pattern) 17. 观察者模式 (Observer Pattern)
设计模式C++学习之桥梁模式(Bridge)
软件项目管理系列The.Software.Project.Managers.Bridge.to.Agility.May.2008
11、桥梁模式BRIDGE PATTERN 12、命令模式COMMAND PATTERN 13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、...
创建型模式 (100%) 设计模式面面观(8):创建型模式总结 (100%) 设计模式面面观(9):适配器模式(Adapter Pattern)-结构型模式 (100%) 设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式 ...
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式...
1. C# Meets Design Patterns ....Bridge Pattern 36 Example: OpenBook 39 Pattern Comparison 46 3. Structural Patterns: Composite and Flyweight . . . . . . . . . . . . . . . . . . . . . . . . . 49
7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法...
桥接模式,参考自 http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html
第 11 章 桥梁模式【BRIDGE PATTERN】 ..................................................................................................... 97 第 12 章 命令模式【COMMAND PATTERN】 .........................
设计模式精解- GoF 23 种设计模式解析附 C++实现源码 目 录 0 引言 ...........................................................................................................................................
Structure of a PCI controller (host bridge).
桥接模式是一种结构型设计模式,它的目的是将抽象化与实现化解耦,使得它们可以独立变化。这种模式主要用于处理当一个类存在两个或多个独立的变化的维度时的情况,例如,当一个类的抽象部分和实现部分可能发生变化,...
The Bridge Pattern Chapter 14. The Decorator Pattern Chapter 15. The Composite Pattern Chapter 16. The Facade Pattern Chapter 17. The Flyweight Pattern Chapter 18. The Proxy Pattern Part 4 - The ...