什么是桥接模式
将抽象部分与实现部分分离开来,使抽象部分与实现部分能够自由的独立变化。
抽象部分:并不是指传统的抽象类,而是指实现部分的共有特性
实现部分:我的理解是抽象部分的来源,一组对象将共同对象抽离出来后,剩下的就是实现部分
例如有一组有颜色有形状的图像,那么可以从颜色中抽离出形状作为抽象部分,而颜色作为实现部分
桥接模式的角色
Abstraction:抽象类
RefinedAbstraction:扩充抽象类
Implementor:实现类接口
ConcreteImplementor:具体实现类
针对上面的图像形状与颜色的关系,我们来写一个Demo:
Abtraction:
public abstract class Abstraction {
protected Implementor Imple;
protected void setImple(Implementor imple){
this.Imple=imple;
}
public abstract void Operator();
}
Implementor:
public interface Implementor {
void setColor();
}
Red:
public class Red implements Implementor{
public void setColor(){
System.out.println("染成了红色");
}
}
Blue:
public class Blue implements Implementor{
public void setColor(){
System.out.println("染成了蓝色");
}
}
triangle:
public class triangle extends Abstraction{
public void choose(Implementor imple){
super.setImple(imple);
}
@Override
public void Operator(){
super.Imple.setColor();
}
}
main:
public class main {
public static void main(String[] args){
triangle tri=new triangle();
tri.choose(new Red());
tri.Operator();
tri.choose(new Blue());
tri.Operator();
}
}
结果:
桥接模式的一点思考
桥接模式将抽象部分与实现部分由继承关系变为了关联关系,从而实现松耦合,使抽象部分和实现部分都能很好的进行扩展,为什么说桥接模式是松耦合呢?拿上面的例子来说,如果使用继承关系,即颜色类继承图像类,假设我们想扩展正方形,由于继承关系,那么正方形可以被染成蓝色,也可以被染成红色,但我们不允许让正方形被染成蓝色,此时便会有问题,正方形被迫染成了蓝色(当然也可以覆盖相应方法,但这是一种糟糕的方式,代码逻辑非常混乱),如果使用桥接模式,将其变为上面例子中的关联关系,则新增一个图形或是颜色都不会影响彼此,不存在被动接受的情况,桥接模式本身适用于两个维度的事物之间的关联度不高的情况,满足开闭原则,使两个维度的事物可以自由变换