- 浏览: 176220 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 902学完设计模式,示例代码保存着,以后看看。 -
22.享元模式(Flyweight Pattern)
2012-11-26 14:55 14941.定义 使用共享对象可有效地支持大量的细粒度的对象。 是 ... -
21.解析器模式(Interpreter Pattern)
2012-11-23 14:29 46541.定义 给定一门语言,定义它的文法的一种表示,并定义一个解 ... -
20.状态模式(State Pattern)
2012-11-22 14:02 13881.定义 当一个对象内在状态改变时,允许其改变行为,这个对象 ... -
19.访问者模式(Visitor Pattern)
2012-11-19 16:28 2011话说有一个银行,有三 ... -
18.备忘录模式(Memento Pattern)
2012-11-16 15:01 1124引子 俗话说:世上难 ... -
17.门面模式(FacadePattern)
2012-11-15 15:23 10931.定义 要求一个子系统 ... -
16.观察者模式(ObserverPattern)
2012-11-14 16:08 15921.定义 定义对象之间一种一对多的依赖关系,使得每当一个对象 ... -
15.组合模式(Composite Pattern)
2012-11-13 17:35 18511.定义 将对象组合成树形结构以表示“部分-整体”的层次结构 ... -
14.迭代器模式(Iterator Pattern)
2012-11-13 14:27 12271.定义 提供一种方法访 ... -
13.适配器模式(Adapter Pattern)
2012-11-12 17:24 13951.定义 将一个类的接口变换成客户端所期待的另一种接口,从而 ... -
12.策略模式(Strategy Pattern)
2012-11-12 13:51 11621.定义 定义一组算法,将每个算法都封装起来,并且使它们之间 ... -
11.装饰模式(Decorator Pattern)
2012-11-08 15:57 10971.定义 动态地给一个对 ... -
10.责任链模式(Chain of Responsibility)
2012-11-07 16:15 11301.定义: 使多个对象都有机会处理请求,从而避免了请求的发送 ... -
9.命令模式(Command Pattern)
2012-11-07 14:45 10511.定义 将一个请求封装 ... -
8.中介者模式(Mediator Pattern)
2012-11-01 15:57 15861.定义: 用一个中介对象封装一系列的对象交互,中介者使个对 ... -
7.原型模式(Prototype Pattern)
2012-11-01 10:54 13851.定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原 ... -
6.代理模式(Proxy Pattern)
2012-10-30 16:09 11911.定义: 为其他对象提供一种代理以控制这个对象的访问。 ... -
5.建造者模式(Builder Pattern)
2012-10-26 17:06 10861.定义: 将一个复杂对象的构建与它的表示分离,使得同样的构 ... -
4.模板方法模式(Template Method Pattern)
2012-10-25 16:33 1215定义: 定义一个操作中的算法的框架,而将一些步骤延迟到 ...
相关推荐
11、桥梁模式BRIDGE PATTERN 12、命令模式COMMAND PATTERN 13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、...
3.桥梁模式(Bridge Pattern): 桥梁模式是将抽象部分与实现部分分离,使他们可以独立地变化。它的主要作用是降低耦合度,提高代码的灵活性和可扩展性。 4. 装饰者模式(Decorator Pattern): 装饰者模式是动态地...
11. 桥梁模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。 12. 命令模式(Command Pattern):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或...
桥梁模式(Bridge Pattern) 桥梁模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种模式非常适合在实现细节经常需要变化的情况下使用,因为它可以避免在代码中硬编码实现细节。 ### 12. 命令模式...
桥梁模式(Bridge Pattern)是设计模式中的一种结构型模式,它的核心思想是将抽象部分与实现部分分离,使得它们可以独立地进行变化。在这个主题中,我们将深入探讨桥梁模式的原理、结构以及如何在Java中实现。 首先...
7. 桥梁模式(Bridge Pattern) 桥梁模式是一种结构模式,提供了一种将对象的抽象和实现分离的方式,使得对象的抽象和实现可以独立变化。桥梁模式的优点是可以实现对象的灵活性和可维护性。 8. 合成模式...
**桥梁模式(Bridge Pattern)详解** 桥梁模式是一种结构型设计模式,它将抽象部分与实现部分分离,使得它们可以独立地进行变化。这种模式的主要目的是为了将抽象化和实现化解耦,使得两者可以独立发展,增加了系统...
11. 桥梁模式(Bridge Pattern) 桥梁模式将抽象部分与实现部分分离,使它们都可以独立地变化。它通过提供抽象化和实现化之间的桥梁来达到这个目的。 12. 命令模式(Command Pattern) 命令模式将请求封装为具有...
7. 桥梁模式(Bridge Pattern):桥梁模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立变化。这个模式允许你在不修改具体实现的情况下,改变对象的行为。比如,你可以组合“早上好”和“新...
7. 桥梁模式(Bridge Pattern) 桥梁模式将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,...
19. 结构型模式(Structural Patterns):关注如何组织类和对象以形成更大的结构,如桥梁模式、组合模式、装饰器模式、适配器模式、外观模式、享元模式、代理模式。 20. 行为型模式(Behavioral Patterns):关注...
策略模式【STRATEGY PATTERN】 ...桥梁模式【BRIDGE PATTERN】 命令模式【COMMAND PATTERN】 装饰模式【DECORATOR PATTERN】 迭代器模式【ITERATOR PATTERN】 组合模式【COMPOSITE PATTERN】 ......
桥梁模式(Bridge Pattern) 将抽象部分与它的实现部分分离,使它们都可以独立变化。这种模式提高了系统的可扩展性和可维护性。 #### 12. 命令模式(Command Pattern) 将请求封装为一个对象,从而使你可用不同的...
11. 桥梁模式【BridgePattern】:将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥梁模式用于将抽象与实现解耦,使得两者可以独立地进行变化。 12. 命令行模式【CommandPattern】:将请求封装为对象,...
桥梁模式(Bridge Pattern) 桥梁模式的目的是将抽象部分与它的实现部分分离,使它们可以独立变化。这种模式通过使用接口和实现分离的技巧,使得可以独立地扩展抽象和实现两个维度,增强了代码的可扩展性和可维护...
桥梁模式 (Bridge Pattern)** 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 **12. 命令模式 (Command Pattern)** 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或...
桥梁模式(Bridge Pattern) 将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种模式有助于解决抽象和实现紧密耦合的问题。 #### 12. 命令模式(Command Pattern) 将请求封装为一个对象,从而使用户...
桥梁模式(Bridge Pattern)是一种结构型设计模式,旨在通过将抽象部分与它的实现部分分离,来使得它们可以独立地变化。该模式主要涉及两个角色:抽象化(Abstraction)和实现化(Implementor)。在PHP中实现桥梁...