设计模式——桥梁模式【Bridge Pattern】

今天我要说说我自己,梦想中的我自己,我身价过亿,有两个大公司,一个是房地产公司,一个是服装制造业,这两个公司都很赚钱,天天帮我在累加财富,其实是什么公司我倒是不关心,我关心的是是不是在赚钱,赚了多少,这才是我关心的,我是商人呀,唯利是图是我的本性,偷税漏税是我的方法,欺上瞒下、压榨员工血汗我是的手段嘛,我先用类图表示一下我这两个公司:

类图很简单,声明了一个Corp抽象类,定义一个公司的抽象模型,公司首要是赚钱的,不赚钱谁开公司,做义务或善举那也是有背后利益支撑的,我还是赞成这句话天下熙熙,皆为利来;天下壤壤,皆为利往,那我们先看Corp类的源代码:

合适的方法存在合适的类中,这个基本上是每本Java基础书上都会讲的,但是到实际的项目中应用的时候就不是这么回事儿了,正常的很。我们继续看两个实现类如何实现的,先看HouseCorp类,这个是我最赚钱的公司:

 

然后看服装公司,虽然不景气,但好歹也是赚钱的:

 

 

两个公司都有了,那肯定有人会关心两个公司的运营情况呀,我自己怎么也要知道它是生产什么的,赚多少钱吧,那看看这个Client.java是什么样子的:

 

 

终于在有一天我觉得赚钱速度太慢,于是我上下疏通,左右打关系,终于开辟了一条赚钱的康庄大道:生产山寨产品,什么产品呢?就是市场上什么牌子的东西火爆我生产什么牌子的东西,甭管是打火机还是电脑,只要它火爆,我就生产,赚过了高峰期就换个产品,打一枪换一个牌子,不承担售后成本、也不担心销路问题,我只有正品的十分之一的价格,你买不买?哈哈,赚钱呀!

企业的方向定下来了,通过调查,市场上前段时间比较火爆的是苹果iPod,那咱就生产这个,把服装厂该成iPod生产厂,看类图的变化:

 

好,我的企业改头换面了,开始生产iPod产品了,看我IPodCorp类的实现:

这个厂子修改完毕了,我这个董事长还要去看看到底生产什么的,看这个Client.java程序:

 

 

确实,只用修改了几句话,我的服装厂就开始变成山寨iPod生产车间,然后就看我的财富在积累积累,你想呀山寨的东西不需要特别的销售渠道(正品到哪里我就到哪里),不需要维修成本(大不了给你换个,你还想咋地,过了高峰期我就改头换面了你找谁维修去,投诉?投诉谁呢?),不承担广告成本(正品在打广告,我还需要吗?需要吗?),但是我也有犯愁的时候,我这是个山寨工厂,要及时的生产出市场上流行产品,转型要快,要灵活,今天从生产iPod转为生产MP4,明天再转为生产上网本,这个都需要灵活的变化,不要限制的太死,那问题来了,每次我的厂房,我的工人,我的设备都在,不可能每次我换个山寨产品我的厂子就彻底不要了,这不行,成本忒高了点,那怎么办?

ThinkingThinking.I got an idea!,这样设计:

 

 

Corp类和Product类建立一个关联关系,可以彻底解决我以后山寨公司生产产品的问题,看程序说话,先看Product抽象类:

简单,忒简单了,看House产品类:

不多说,看Clothes产品类:

 

下面是iPod产品类:

产品类是有了,那我们再看Corp抽象类:

 

这里多了个有参构造,其目的是要继承的子类都必选重写自己的有参构造函数,把产品类传递进来,再看子类HouseCorp的实现:

理解上没有多少难度,不多说,继续看山寨公司的实现:

HouseCorp类和ShanZhaiCorp类的区别是在有参构造的参数类型上,HouseCorp类比较明确,我就是只要House类,所以直接定义传递进来的必须是House类, 一个类尽可能少的承担职责,那方法也是一样,既然HouseCorp类已经非常明确只生产House产品,那为什么不定义成House类型呢?ShanZhaiCorp就不同了,它是确定不了生产什么类型。

好了,两大对应的阵营都已经产生了,那我们再看Client程序:

这个山寨公司的前身是生产衣服的,那我现在要修改一下,生产iPod,看如下的变化:

ShanZhaiCorp shanZhaiCorp = new ShanZhaiCorp(new IPod());

就修改了这一一句话代码就完成了生产产品的转换。那我们深入的思考一下,既然万物都是运动的,我现在只有房地产公司和山寨公司,那以后我会不会增加一些其他的公司呢?或者房地产公司会不会对业务进行细化,比如分为公寓房公司,别墅公司,以及商业房公司等等呢?那我告诉你,会的,绝对的会的,但是你发觉没,这种变化对我们上面的类图没有大的修改,充其量是扩展,你看呀:增加公司,你要么继承Corp类,要么继承HouseCorpShanZhaiCorp,不用再修改原有的类了;

增加产品,继承Product类,或者继承House类,你要把房子分为公寓房、别墅、商业用房等等;你都是在扩展,唯一你要修改的就是Client类,你类都增加了哪能不修改调用呢,也就是说Corp类和Product类都可以自由的扩展,而不会对整个应用产生太的变更,这就是桥梁模式。

为什么叫桥梁模式?我们看一下桥梁模式的通用类图:

看到中间那根带箭头的线了吗?是不是类似一个桥,连接了两个类?所以就叫桥梁模式。今天说到桥梁模式,那就多扯几句,大家对类的继承有什么看法吗?继承的优点有很多,可以把公共的方法或属性抽取,父类封装共性,子类实现特性,这是继承的基本功能,缺点有没有?有,强关联关系,父类有个方法,你子类也必须有这个方法,是不可选择的,那这会带来扩展性的问题,我举个简单的例子来说明这个问题:Father类有一个方法ASon继承了这个方法,然后GrandSon也继承了这个方法,问题是突然有一天Son要重写父类的这个方法,他敢做吗?绝对不敢!GrandSon可是要用从Father继承过来的方法A,你修改了,那就要修改SonGrandSon之间的关系,那这个风险就大了去。

今天讲的这个桥梁模式就是这一问题的解决方法,桥梁模式描述了类间弱关联关系,还说上面的那个例子,Fater类完全可以把可能会变化的方法放出去,Son子类要有这个方法很简答,桥梁搭过去,获得这个方法,GrandSon也一样,即使你Son子类不想使用这个方法了,也没关系,对GrandSon不产生影响,他不是从你Son中继承来的方法! 继承不能说它不好,非常好,但是有缺点的,我们可以扬长避短,对于比较明确不发生变化的,则通过继承来完成,若不能确定是否会发生变化的,那就认为是会发生变化,则通过桥梁模式来解决,这才是一个完美的世界。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值