设想若是要绘制矩形、圆形、椭圆、正方形,咱们至少须要4个形状类,可是若是绘制的图形须要具备不一样的颜色,如红色、绿色、蓝色等,此时至少有以下两种设计方案:ide
第一种方案是为每一种形状都提供一套各类颜色的版本ui
第二种方案是根据实际的须要对形状和颜色进行组合this
对于有两个变化维度(即两个变化的缘由)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二便是桥接模式的应用。桥接模式将继承关系转换为关联关系,从而下降了类与类之间的耦合,减小了代码编写量。设计
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们均可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。code
抽象部分:对象
public abstract class Shape { private ShapeColor shapeColor; public Shape(ShapeColor color) { this.shapeColor = color; } public abstract String getShapeName(); @Override public String toString() { return "个人形状是:" +this.getShapeName() + ", 个人颜色是:" + this.shapeColor.getColor(); } } public class Cycle extends Shape { public Cycle(ShapeColor color) { super(color); } @Override public String getShapeName() { return "圆形"; } } public class Square extends Shape { public Square(ShapeColor color) { super(color); } @Override public String getShapeName() { return "正方形"; } } public class Triangle extends Shape { public Triangle(ShapeColor color) { super(color); } @Override public String getShapeName() { return "三角形"; } }
实现部分:blog
public abstract class ShapeColor { public abstract String getColor(); } public class Bule extends ShapeColor { @Override public String getColor() { return "蓝色"; } } public class Red extends ShapeColor { @Override public String getColor() { return "红色"; } } public class Yellow extends ShapeColor { @Override public String getColor() { return "黄色"; } }
客户端:继承
public class Client { public static void main(String[] args) { ShapeColor yellow = new Yellow(); ShapeColor red = new Red(); Shape yellowCycle = new Cycle(yellow); Shape redCycle = new Cycle(red); Shape yellowSquire = new Square(yellow); Shape redSquire = new Square(red); System.out.println(yellowCycle); System.out.println(redCycle); System.out.println(yellowSquire); System.out.println(redSquire); } }
抽象部分的类继承体系,顶层是Shape抽象类,Shape的实现类能够有不少,圆形,三角形,正方形,菱形,还能够随意扩展出来很是多的形状接口
实现部分的类继承体系表示的是Shape的颜色,可有多重颜色,根据本身的须要,还能够扩展出来更多的颜色get
抽象部分和实现部分二者是能够独立扩展的,二者之间的关系是组合的关系,实现部分做为一个属性,集成到抽象部分的类中去,这是两个体系发生联系的地方,表如今类图上,就是两个互相独立演化的部分,中间用一条线连起来,这条线看起来就像是一座桥,这个模式就叫作桥接模式
系统有两个独立的变化维度,而这两个维度都须要进行扩展
想要防止由于多层次的继承致使类数量的膨胀
抽象化角色和实现化角色能够以继承的方式独立扩展而互不影响,在程序运行时能够动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统须要对抽象化角色和实现化角色进行动态耦合