1.一个简短的引论

1)模式概述:将抽象部分与实现部分分离。使它们都能够独立的变化。让抽象类和派生类各自实现自己的对象。当一个系统有多维度的变化时,将各个维度分离出来让它们独立于变化(多角度地分类实现对象),从而降低耦合。

它非常好的符合了OCP和优先使用对象,从而避免了仅仅用继承所造成的大量类的添加

2)核心:将抽象化(Abstraction)与实现化(Implementation)解耦。用组合/聚合关系取代继承

抽象化:将存在共性的多个实体当做一个实体对待。忽略多余信息

实现化:抽象化给出的详细实现

解耦:将存在于两个实体行为间的强关联去掉。即将抽象化和实现化之间的强关联变换为弱关联,达到解耦的目的。

2.UML与代码实现

1)结构:UML

结构:含有两个等级

抽象化等级结构:由抽象化角色和修正抽象化角色组成

实现化等级结构:由实现化角色和详细实现化角色组成

模式组成:

抽象化(Abstraction)角色:抽象化给出的定义,并保存一个队实现化对象的引用

修正抽象化(RefinedAbstraction)角色:苦熬站抽象化角色,改变和修正父类对抽象化的定义

实现化(Implementor)角色:给出实现化角色的接口,但不给出详细的实现。

详细实现化(ConcreteImplementor)角色:给出实现化角色接口的详细实现

(实现化角色仅仅给出底层操作,而抽象化角色仅仅给出基于底层操作的更高一层的操作。)

2)java代码

public class Bridge{
//client实现
public static void main(String[]args)
{
Abstraction ab = new RefinedAbstraction(); ab.SetImplementor(new ConcreteImplementorA());
ab.Operation(); ab.SetImplementor(new ConcreteImplementorB());
ab.Operation();
}
}
//Implementor类
abstract class Implementor
{
public abstract void Operation();
}
//ConcreteImplementorA和ConcreteImplementorB等派生类
class ConcreteImplementorA extends Implementor
{
public void Operation()
{
System.out.println("详细实现A的方法运行");
}
}
class ConcreteImplementorB extends Implementor
{
public void Operation()
{
System.out.println("详细实现B的方法运行");
}
}
//Abstraction类
class Abstraction
{
protected Implementor implementor;
public void SetImplementor(Implementor implementor)
{
this.implementor=implementor;
}
public void Operation()
{
implementor.Operation();
}
}
//RefinedAbstraction类
class RefinedAbstraction extends Abstraction
{
public void Operation()
{
implementor.Operation();
}
}

3.长处

1)Bridge模式使对象间的组合关系解耦了抽象与实现之间固有的绑定关系。使得抽象和实现客运沿着各自的维度来变化

2)Bridge模式有时候类似于多继承方案,可是多继承往往违背单一职责原则,复用性较差。

它是比多继承方案更好的解决方法

3)一般用在两个很强的变化维度中,假设某个方向的变化维度并不强烈。则不一定要使用Bridge模式

4.应用

1)一个系统须要在构件的抽象化角色和详细化角色之间添加很多其它的灵活性。避免在两个层次间建立静态的联系

2)设计要求实现化角色的不论什么改变不影响client,即实现化角色的改变对client全然是透明的

3)一个构件有多余一个抽象化角色和实现化角色。系统须要他们之间进行动态耦合

4)系统中使用继承没有问题。可是抽象化角色和详细化角色须要独立变化,设计要求独立管理二者

5.其他相关模式

1)装饰模式:为了降低子类的数目,避免出现复杂的继承关系,有两种模式可供选用:桥接模式、装饰模式。

2)建造者模式:由对象的创建所带来的耦合性,能够用建造者模式解决,处理详细问题时可结合二者使用

小结

桥接模式把两个角色之间的继承关系改为聚合关系,从而使二者能够各自独立的变化。把原来在基类的实现化细节抽象出来,再构造到一个实现化的结构中。然后把原来的基类改造成一个抽象化的等级结构,这样就实现了系统在多个维度独立的变化

版权声明:本文博主原创文章,博客,未经同意不得转载。

B桥接模式ridge的更多相关文章

  1. BridgePattern(桥接模式)

    /** * 桥接模式 * @author TMAC-J * 应用于多维度方案 * 用组合的形式代替继承 * 符合单一职责原则 * 一个类只有一个引起他变化的原因 * 增加程序灵活性 */ public ...

  2. PHP设计模式(八)桥接模式(Bridge For PHP)

    一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 二.案例 1.模拟毛笔(转) 需求:现在需要准备三种粗细(大中小),并且有五种颜色的比 如果使用蜡 ...

  3. 设计模式(八)桥接模式(Bridge Pattern)

    一.引言 这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视 ...

  4. 设计模式--桥接模式Bridge(结构型)

    一.概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或者多个维度的变化,如何应对这种"多维度的变化",就可以利用桥接模式. 引例: 设想如果要绘制矩形.圆形.椭圆.正方形,我 ...

  5. vmware中虚拟机与主机ping不通,桥接模式,IP地址在同一网段,无法互ping!

    现象描述:网卡选用的桥接模式,IP地址在同一个网段,虚拟机内部可以正常上网,但是Guest OS和Host OS无法互ping! 原因:虚拟机里的防火墙没有关闭,导致禁用ping功能. 解决方法:关闭 ...

  6. 桥接模式/bridge模式/对象结构型

    意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 动机 当一个抽象类有多个实现时,通常用继承来协调它们.但是继承机制将抽象和实现固定,难以对抽象部分和实现部分独立地进行修改.扩充和重用. ...

  7. Objective-C 桥接模式 -- 简单实用和说明

    桥接模式---把两个相关联的类抽象出来, 以达到解耦的目的 比如XBox遥控器跟XBox主机, 我们抽象出主机和遥控器两个抽象类, 让这两个抽象类耦合 然后生成这两个抽象类的实例XBox & ...

  8. C#设计模式-桥接模式

    这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控 ...

  9. C#设计模式系列:桥接模式(Bridge)

    1.桥接模式简介 1.1>.定义 当一个抽象可能有多个实现时,通常用继承来进行协调.抽象类定义对该抽象的接口,而具体的子类则用不同的方式加以实现.继承机制将抽象部分与它的实现部分固定在一起,使得 ...

随机推荐

  1. 如何使用Reaver破解Wi-Fi网络的WPA密码

    via: http://lifehacker.com/5873407/how-to-crack-a-wi+fi-networks-wpa-password-with-reaver 译者:Mr小眼儿 本 ...

  2. asp.net检查服务器上目录或文件是否存在示例

    原文 asp.net检查服务器上目录或文件是否存在示例 asp.net为我们提供了文件系统对象了,对于目录与文件判断是否存在我们有System.IO.File.Exists与System.IO.Dir ...

  3. c#1所搭建的核心基础之委托

    本文将对c#1的委托进行详细探索 委托(delegate)   注 delegate:vt.委派代表; 授权给; [法律]债务转移;  委托作用:在恰当的时间执行一系列操作 1.简单委托的构成 声明委 ...

  4. iOS 使用UIBezierPath类实现随手画画板

    在上一篇文章中我介绍了 UIBezierPath类 介绍 ,下面这篇文章介绍一下如何通过这个类实现一个简单的随手画画板的简单程序demo,功能包括:划线(可以调整线条粗细,颜色),撤销笔画,回撤笔画, ...

  5. activemq java版本要求

    <pre name="code" class="html">activemq: redis01:/root# cp apache-activemq- ...

  6. MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据

    看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...

  7. Swift - 动画效果的实现方法总结(附样例)

    在iOS中,实现动画有两种方法.一个是统一的animateWithDuration,另一个是组合出现的beginAnimations和commitAnimations.这三个方法都是类方法. 一,使用 ...

  8. dialog开发

    dialog开发屏幕编程:ok_code在程序里用sy-ucomm接受 调用其他事物代码:call transaction ‘SE38’. 1:50 选择屏幕之屏幕按钮: selection-scre ...

  9. 【iOS】iOS的iTunes文件共享,在程序Document路径

    有时候程序开发须要通过沙盒中的 documents目录与用户共享文件,iTunes默认是不支持iTunes file Sharing的,首先设置 info-list的Application suppo ...

  10. SVN无法修改以前提交日志的办法

    一直用SVN作为代码备份,但是今天偶然发现SVN上不能修改意见提交的代码,于是乎开始谷歌了,最后发现只需要在该工程下的hooks目录下放入pre-revprop-change.bat文件即可. pre ...