什么时桥接模式?
桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。
桥接模式是一种结构型的模式,他的目的就是为了保证系统各部分的独立性和可扩展性
桥接模式核心思想
将原本耦合的两个模块,通过正确拆分,使之成为两个不同维度的模块,再通过聚合,组合等方式进行"桥梁搭建",这样两个维度变化互不干扰,只用桥梁来进行联系
如何正确判断两个独立变化的维度是桥接模式的难点
原理类图
下面我们来通过手机例子来对桥接模式进行理解:
对于这样的需求:
我们想到的是:
这样看似实现了该需求,
但是当我要添加一个手机型号时,就要扩展一个型号类,相应手机品牌也要退出各自的手机,又要扩展类,这样如果一多起来,照成的问题就是:类爆炸
所以,我们通过桥接模式思想来改进它:
1.寻找该需求下是否可以分离出两个维度
我们发现,手机型号,和手机品牌是两个不同的维度
手机型号是抽象,品牌手机是基于手机型号的不同实现
欧克,那我们就将手机型号和手机的品牌划分为两个不同的维度:
代码实现:
public class QaoJie {
public static void main(String[] args) {
// 一般情况,获取折叠小米手机
XiaoMiPhone xiaoMiPhone = new XiaoMiPhone();
xiaoMiPhone.XiaomiCall();
System.out.println("*****************************************");
// 采用桥接模式,获取折叠板华为手机
ZheDie zeDie = new ZheDie();
zeDie.yangShi(new HuaWeiPhone());
}
}
// 一般情况
/**
* 这样当我们扩展一种手机型号,相应要扩展手机型号下的品牌手机,这样的后果就是,要添加好多个类
*/
interface Phone{
void call();
}
//手机型号
class ZeDie implements Phone{
@Override
public void call() {
System.out.println("折叠手机");
}
}
//相应型号下的品牌手机
class XiaoMiPhone extends ZeDie{
public void XiaomiCall(){
super.call();
System.out.println("小米手机");
}
}
class HuaWei extends ZeDie{
public void HuaWeiCall(){
super.call();
System.out.println("华为手机");
}
}
//添加型号
class HuaGai implements Phone{
@Override
public void call() {
System.out.println("滑盖手机");
}
}
class HuaWei2 extends HuaGai{
public void HuaWeiCall(){
super.call();
System.out.println("华为手机");
}
}
//使用桥接模式改进
/**
* 思路:
* 将各品牌和各手机型号分别抽离出来,采用聚合的方式进行依赖
*/
interface PinPai{
void call();
}
class HuaWeiPhone implements PinPai{
@Override
public void call() {
System.out.println("华为手机");
}
}
class XiaoMi implements PinPai{
@Override
public void call() {
System.out.println("小米手机");
}
}
//手机类型
interface Phone2{
void yangShi(PinPai pinPai);
}
class ZheDie implements Phone2{
@Override
public void yangShi(PinPai pinPai) {
pinPai.call();
System.out.println("折叠手机");
}
}
class HuaGaiPhone implements Phone2{
@Override
public void yangShi(PinPai pinPai) {
pinPai.call();
System.out.println("滑盖手机");
}
}
//这样,我们在扩展手机型号时,就只需要扩展型号类就行
class ChuPinPhone implements Phone2{
@Override
public void yangShi(PinPai pinPai) {
pinPai.call();
System.out.println("触屏手机");
}
}
运行结果:
使用场景:
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
总结:
1。实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开,有助于系统进行分层设计,从而产生更好的结构化系统
2.对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其他的部分由具体业务来完成
3.桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本
4.桥接模式的引入增加了系统的理解和设计难度,由于聚合关系建立在抽象层,要求开发者针对抽象进行设计和编程
5.桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景