说在开头:我并不认为这是什么设计模式,正常人就应该是这么思考的...不过书上既然都有写,我也就随意说一下吧!
此模式主要通过组合与聚合的方式用来解决复杂的类关系问题,通过抽象出多个类,从多个维度来描述解决问题,从而让混乱的类关系结构变得清晰;
先说下组合与聚合的概念;
组合:用来描述必须有的一种关系,比如鸟儿必须有翅膀!否则就无法诞生鸟儿对象!
聚合:用来描述一种可有可无的关系,比如你不一定要有钱...没钱你也可以存在...(我咋感觉我说这话有点违背良心呢...没钱还怎么活!快给我点钱吧!我薪水好低我好穷的!)
然后我们先来下个定义;
桥接模式:用来将抽象部分与它的实现部分相分离,使它们可以独立的变化!这是什么意思呢?别急,往下看!
假设现在需要你来设计一个电脑对象:
你可能是这样来设计的:
//电脑父类 ,为了节省代码,我不写属性了!我们来看一下类图:
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(这是个抽象)类相分离,而独自形成一个品牌类,从而达到多维度扩展的目的!