桥接模式
关注抽象的设计,抽象包含一组抽象方法的类,而这些抽象方法可能包含多个实现。每个子类提供了抽象方法的不同实现,但是当需要对该层次进行子类的化的时候就出现了不足。
此时可创建一个桥,然后将这些抽象的方法都移到接口中,那么,抽象就将依赖接口的实现了。
桥接的意图就时将抽象和抽象方法的实现相互分离来实现解耦,以便二者可以相互独立地变化。
桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。
桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。
模式使用的场景:
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,
通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
总结:
1、桥接模式实现了抽象化与实现化的脱耦。他们两个互相独立,不会影响到对方。
2、对于两个独立变化的维度,使用桥接模式再适合不过了。
3、对于“具体的抽象类”所做的改变,是不会影响到客户。
例子:
public abstract class Shape {
Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void draw();
}
public class Circle extends Shape{
public void draw() {
color.bepaint("圆形");
}
}
public interface Color {
public void bepaint(String shape);
}
public class White implements Color{
public void bepaint(String shape) {
System.out.println("白色的" + shape);
}
}
public class Client {
public static void main(String[] args) {
//白色
Color white = new White();
//圆形
Circle circle = new Circle();
circle.setColor(white);
circle.draw();
}
}
运行结果:
白色的圆形