桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
UML图
抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接 口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层 的操作。
具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。
优点:
1)可以将接口与实现相分离。
2)提高了可扩展性。
3)对客户端隐藏了实现的细节。
使用场景:
1)想避免在抽象及其实现之间存在永久的绑定。
2)抽象及其实现可以使用子类进行扩展。
3)抽象的实现被改动应该对客户端没有影响,不用重新编译代码。
在图10-4中,如果需要增加一种新型号的毛笔,只需扩展左侧的“抽象部分”,增加一个新的扩充抽象类;如果需要增加一种新的颜色,只需扩展右侧的“实现部分”,增加一个新的具体实现类。扩展非常方便,无须修改已有代码,且不会导致类的数目增长过快。
public interface Color { //颜色类 void bepaint(String penType,String name); //用不同类型的笔着色 }
public class Blue implements Color{ public void bepaint(String penType,String name) { System.out.println(penType + "蓝色的" + name + "."); } }
public class Black implements Color{ public void bepaint(String penType,String name) { System.out.println(penType + "黑色的" + name + "."); } }
public abstract class Pen { protected Color color; //颜色 public void setColor(Color color) { this.color = color; } public abstract void draw(String name); //画画 }
public class BigPen extends Pen{ public void draw(String name) { String penType="大号毛笔绘制"; this.color.bepaint(penType,name); } }
public class MiddlePen extends Pen{ public void draw(String name) { String penType = "中型笔绘制"; this.color.bepaint(penType,name); } }
public class SmallPen extends Pen{ public void draw(String name) { String penType = "小型笔绘制"; this.color.bepaint(penType,name); } }
public class Client { public static void main(String args[]) { Color color; Pen pen; color = new Blue(); pen = new BigPen(); pen.setColor(color); pen.draw("鲜花"); } }
多维变化类或者多个树状图间的耦合;
想为构建的抽象与具体化提供更多灵活性,避免两层次间建立静态的继承联系;
不希望使用继承或因多层继承导致系统类个急剧增加的额系统;
一个类存在两个或多个独立变化的维度,而且都需要独立进行扩展。