参考:
https://www.cnblogs.com/V1haoge/p/6497919.html
http://blog.youkuaiyun.com/xiefangjin/article/details/51056411
1.桥接模式
桥接是一个接口,它与一方应该是绑定的,也就是解耦的双方中的一方必然是继承这个接口的,这一方就是实现方,而另一方正是要与这一方解耦的抽象方,如果不采用桥接模式,一般我们的处理方式是直接使用继承来实现,这样双方之间处于强链接,类之间关联性极强,如要进行扩展,必然导致类结构急剧膨胀。采用桥接模式,正是为了避免这一情况的发生,将一方与桥绑定,即实现桥接口,另一方在抽象类中调用桥接口(指向的实现类),这样桥方可以通过实现桥接口进行单方面扩展,而另一方可以继承抽象类而单方面扩展,而之间的调用就从桥接口来作为突破口,不会受到双方扩展的任何影响。
//申明桥
public interface Qiao {
//目的地B
void targetAreaB();
}
/**
* 目的地B1
*/
public class AreaB1 implements Qiao {
@Override
public void targetAreaB() {
System.out.println("我要去B1");
}
}
/**
* 目的地B2
*/
public class AreaB2 implements Qiao {
@Override
public void targetAreaB() {
System.out.println("我要去B2");
}
}
//来源地(桥的另一端)
public abstract class AreaA {
//这里引用桥接口
Qiao qiao;
//来源地
abstract void fromAreaA();
}
/**
* 来源地A1
*/
public class AreaA1 extends AreaA {
@Override
void fromAreaA() {
System.out.println("我来自A1");
}
}
/**
* 来源地A2
*/
public class AreaA2 extends AreaA {
@Override
void fromAreaA() {
System.out.println("我来自A2");
}
}
//----------------------------------------------------//
public class Clienter {
public static void main(String[] args) {
AreaA a = new AreaA2();
a.qiao = new AreaB2();
a.fromAreaA();
a.qiao.targetAreaB();
}
}
2.和适配器模式比较
共同点
桥接和适配器都是让两个东西配合工作
出发点不同。
1)适配器:改变已有的两个接口,让他们相容。
2)桥接模式:分离抽象化和实现,使两者的接口可以不同,目的是分离。
所以说,如果你拿到两个已有模块,想让他们同时工作,那么你使用的适配器。
如果你还什么都没有,但是想分开实现,那么桥接是一个选择。
桥接是先有桥,才有两端的东西
适配是先有两边的东西,才有适配器
桥接是在桥好了之后,两边的东西还可以变化。