桥接模式是一种很实用的结构型设计模式,若是软件系统中某个类存在两个独立变化的维度,经过该模式能够将这两个维度分离出来,使二者能够独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不一样,它将两个独立变化的维度设计为两个独立的继承等级结构,而且在抽象层创建一个抽象关联,该关联关系相似一条链接两个独立继承结构的桥,故名桥接模式。
桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效控制了系统中类的个数。git
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们均可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。编程
桥接模式的结构与其名称同样,存在一条链接两个继承等级结构的桥,桥接模式结构如图所示:设计模式
铅笔能够分为不一样大小规格的,同时每个规格均可以选择不一样的颜色,规则和颜色做为铅笔的两个维度,若是采用多层继承的结构,每一个铅笔规格下在提供不一样颜色的子类,会致使系统中类的个数急剧增长,同时扩展麻烦,无论增长颜色仍是规格都须要增长大量的具体类。所以这边使用桥接嘛事,将这两个维度设计为两个独立的继承等级结构,为两个维度都提供抽象层,并创建抽象耦合。ide
一般状况下,咱们将具备两个独立变化维度的类的一些普通业务方法和与之关系最密切的维度设计为“抽象类”层次结构(抽象部分),而将另外一个维度设计为“实现类”层次结构(实现部分)。测试
对于铅笔而言,因为规格型号是其固有的维度,所以能够设计一个抽象的铅笔类,在该类中声明并部分实现铅笔的业务方法,而将各类型号的铅笔做为其子类;颜色是铅笔的另外一个维度,因为它与铅笔之间存在一种“设置”的关系,所以咱们能够提供一个抽象的颜色接口,而将具体的颜色做为实现该接口的子类。代码以下:this
//辅助类,设置颜色的时候使用该类 public class Image { private String line; private String color; public String getLine() { return line; } public void setLine(String line) { this.line = line; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } @Override public String toString() { return "Image{" + "line='" + line + '\'' + ", color='" + color + '\'' + '}'; } } //抽象铅笔类 public abstract class AbstractPencil { protected IColorImp color; public void setColorImp(IColorImp color) { this.color = color; } public abstract void draw(); } //抽象颜色设置实现类:实现类接口 public interface IColorImp { void setColor(Image image); } //红色设置实现类:具体实现类 public class RedColorImp implements IColorImp { @Override public void setColor(Image image) { image.setColor("红色"); } } //绿色设置实现类:具体实现类 public class GreenImpl implements IColorImp { @Override public void setColor(Image image) { image.setColor("绿色"); } } //大号铅笔:扩充抽象类 public class BigPencil extends AbstractPencil { @Override public void draw() { Image image=new Image(); image.setLine("大"); //其余代码 color.setColor(image); //其余代码 System.out.println(image); } } //小号铅笔:扩充抽象类 public class SmallPencil extends AbstractPencil { @Override public void draw() { Image image=new Image(); image.setLine("小"); //其余代码 color.setColor(image); //其余代码 System.out.println(image); } } //测试类 public class Client { public static void main(String[] args) { AbstractPencil pencil=new BigPencil(); IColorImp colorImp=new RedColorImp(); pencil.setColorImp(colorImp); pencil.draw(); } } //Image{line='大', color='红色'}
可以使用配置文件来选定特定型号的铅笔和颜色,当添加新的铅笔尺寸型号或者颜色的时候,只需增长一个对应的扩充抽象类或具体实现类便可,系统具备较好的可扩展性,彻底符合“开闭原则”。设计
在软件开发中,适配器模式一般能够与桥接模式联合使用。适配器模式能够解决两个已有接口间不兼容问题,在这种状况下被适配的类每每是一个黑盒子,有时候咱们不想也不能改变这个被适配的类,也不能控制其扩展。适配器模式一般用于现有系统与第三方产品功能的集成,采用增长适配器的方式将第三方类集成到系统中。桥接模式则不一样,用户能够经过接口继承或类继承的方式来对系统进行扩展。3d
桥接模式和适配器模式用于设计的不一样阶段,桥接模式用于系统的初步设计,对于存在两个独立变化维度的类能够将其分为抽象化和实现化两个角色,使它们能够分别进行变化;而在初步设计完成以后,当发现系统与已有类没法协同工做时,能够采用适配器模式。但有时候在设计初期也须要考虑适配器模式,特别是那些涉及到大量第三方应用接口的状况。code
在软件开发中若是一个类或一个系统有多个变化维度时,均可以尝试使用桥接模式对其进行设计,而不是采用多层继承的方案。将其抽象部分与实现部分分离,下降系统的复杂度。