第十七篇:桥接模式

时间:2022-10-01 23:22:32

说在开头:我并不认为这是什么设计模式,正常人就应该是这么思考的...不过书上既然都有写,我也就随意说一下吧!

此模式主要通过组合与聚合的方式用来解决复杂的类关系问题,通过抽象出多个类,从多个维度来描述解决问题,从而让混乱的类关系结构变得清晰;

先说下组合与聚合的概念;

组合:用来描述必须有的一种关系,比如鸟儿必须有翅膀!否则就无法诞生鸟儿对象!

聚合:用来描述一种可有可无的关系,比如你不一定要有钱...没钱你也可以存在...(我咋感觉我说这话有点违背良心呢...没钱还怎么活!快给我点钱吧!我薪水好低我好穷的!)

然后我们先来下个定义;

桥接模式:用来将抽象部分与它的实现部分相分离,使它们可以独立的变化!这是什么意思呢?别急,往下看!

假设现在需要你来设计一个电脑对象:

你可能是这样来设计的:

//电脑父类 ,为了节省代码,我不写属性了!
class Computer{

}
//现在要你加入联想品牌电脑
class ThinkComputer extends Computer{

}

//现在要你加入惠普品牌电脑
class HpComputer extends Computer{

}

//现在要你加入是联想品牌且有着技嘉主板的电脑
class gigabyteComputer extends ThinkComputer{

}

//现在要你加入是联想品牌且有着华硕主板的电脑
class AsusComputer extends ThinkComputer{

}

//现在要你加入是惠普品牌且有着华硕主板的电脑
class AsusHpComputer extends HpComputer{

}

//现在要你加入是联想品牌且有着技嘉主板且有着安钛克电源的电脑
class gigabyteAntedcComputer extends gigabyteComputer{

}

//现在要你加入有着...且有着xxx显卡的电脑...
//oh my gad ...完全没法玩了,这类层次根本看不下去了!

我们来看一下类图:

第十七篇:桥接模式


什么也不多说,这种思维可行吗?完全是错的嘛!后期我们还有各种各样的电脑需要创建,还需要不断的通过继承来扩展类,可想而知,后期的类关系该是有多么复杂!

而我们正常思维逻辑是,品牌,主板,电源...等等应该形成单独的类,有单独的关系,而电脑拥有着主板,电源,那就采用组合将其集成进去不就行了嘛!

Ok,我们来用正常思维改动一下代码吧!

//电脑父类 
class Computer{
//拥有着品牌属性
private Brand brand;
private MainBoard mainBoard;
//可以继续电源...显卡...
}

//品牌父类
class Brand{

}
//联想品牌
class Think extends Brand{

}
//惠普品牌
class Hp extends Brand{

}

//主板父类
class MainBoard{

}

//技嘉主板
class Gigabyte extends MainBoard{

}

//华硕主板
class Asus extends MainBoard{

}
我们来看一下改写后的类图:
第十七篇:桥接模式

你看,我们随意这么一改,它就是桥接模式了!

可以看到,通过将品牌,主板等维度抽离出来,形成单独的类,不仅减少了类的数量还让整个类关系层次变得简单明了,现在想要创建不同的电脑就变得非常简单了,只需要在不同维度上添加新的子类就可以了!

回到开始说的定义,将抽象部分与实现部分相分离,意思就是,这里的实现指的是联想品牌电脑等对象...通过将联想品牌(这是个实现)与Computer(这是个抽象)类相分离,而独自形成一个品牌类,从而达到多维度扩展的目的!