设计模式之桥接模式 待续

设计模式之桥接模式

目的: 将抽象部分与实现部分分离,使它们都可以独立的变化。

个人理解:  主要用于当出现多个变化点的时候,将多个变化点(实现)与抽象分离,之后通过将变化点以组合的方法放进抽象类   使得抽象部分与实现部分分离。

情景模拟:

1  有一个游戏 坦克大战。 现在要求在电脑和手机里都去实现这个游戏 请先设计出一个坦克。     这时候一般我们会在电脑和手机中分别去实现不同的类  但是这样没有利用好面向对象可复用的优点!

我们可以如此去做 :

桥接模式示例:

 现在已知 有不同的平台这一个变化点 ,还有不同的型号的坦克 如T50  T75  T90等  这也是一个变化点  有2个变化点。 

 将 shot()   run()等都有的虚函数放到一个 tank抽象类中,  我们还要设计一个抽象的运行平台抽象类     然后由这个平台抽象类  产生PC平台类 ,MOBIL平台类。   

tank抽象类要有一个平台抽象类的对象  用于接收平台的类型以便产生特定平台下的tank 。     

通过继承tank可以产生不同平台下的 不同类型的tank类如tankT50   tankT75 在这里面做一些与平台无关的操作!    然后重载shot  run等函数    让它们去调用PC平台类  或者MOBIL平台类的shot()   run()    (因为shot run 应该会在不同平台下实现时调用不同的API)      

模式核心: 通过分离2个变化点  遵守了单一职责原则(如果用多继承就违反了此原则 此原则强调一个类只有一个变化点)

重点在于使用了组合    通过在tank抽象类中加入了一个平台抽象类的对象  从而巧妙实现了分离! 它就是所说的桥

在抽象部分就可以通过这个桥来调用具体实现部分的功能。
  

桥接模式UML类图

桥接模式将实现与抽象分离开来,使得RefinedAbstraction依赖于抽象的实现,这样实现了依赖倒转原则,而不管左边的抽象如何变化,只要实现方法不变,右边的具体实现就不需要修改,而右边的具体实现方法发生变化,只要接口不变,左边的抽象也不需要修改。

说起来,其实桥接模式倒是与抽象工厂模式有点像,可以回忆一下抽象工厂模式,抽象工厂模式也是解决多种因素变化的一种方式,抽象工厂模式中,产品的种类和产品的具体实现都会发生变化,于是将产品的种类抽象出来,将具体的实现隔离开来。

        

最新体会:有一种情况,你事先定义了Abstction类和RefinedAbstraction类,你的代码中直接使用的是RefinedAbstraction类,刚开始RefinedAbstraction是够用的。但后来你希望operation()能在不同的情况下有不同的实现,这时候原有的结构就不够用了,你不可能重新继承一个类,那样所有的地方都必须修改,可以考虑的做法就是继承RefinedAbstraction类,这样的改动就比较少,但这样不是最好的。最好的应该是使用上面的桥接模式,将实现分离出来,这样所有的地方都不需要修改,只要添加它的实现就可以了。

优点

1.将实现抽离出来,再实现抽象,使得对象的具体实现依赖于抽象,满足了依赖倒转原则。

2.将可以共享的变化部分,抽离出来,减少了代码的重复信息。

3.对象的具体实现可以更加灵活,可以满足多个因素变化的要求。

缺点

1.客户必须知道选择哪一种类型的实现。



参考:

http://www.cnblogs.com/cxjchen/p/3156872.html

http://blog.csdn.net/fly_yr/article/details/8574742   这个很好


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值