读书人

Bridge 桥梁形式

发布时间: 2012-10-08 19:54:56 作者: rapoo

Bridge 桥梁模式

《Java与模式》中提到Bridge模式的用意是将“抽象化(abstration)与实现化(Implmentation)脱耦,使二者可以独立的变化”。

?

抽象化就是指多个实体之间的共有概念性联系,就是忽略一些信息,把不同实体当同一实体对待。

?

实现化就是针对抽象化具体的实现。

?

脱藕也就是Bridge中针对抽象化和实现化的重要意图之所在,也就是将抽象化和实现化之间进行一定的分离,降低它们之间的耦合性,继承是属于一种强耦合(强关联),或说将它们之间的强关联关系转化成弱关联关系。

?

强关联就是在程序编译期间已经确定关联关系,而在运行期间不能改变他们之间的关联关系。而弱关联就是动态的确定可以在运行期间改变他们之间的关联。继承关系就是强关联,聚合就是若关联关系,所以Bridge的核心思想就在于将继承关系向聚合关系转换,换句话说就是用聚合代替继承。

?

Bridge模式多用于在实体在两个维度上的动态组合是运用。譬如:食物(Food)是一实体,可以抽象出来,从一个维度扩展来说如具体食物面条(Noodle),米饭(Rice)等,而从另外一个维度扩展可以是干面,湿面,干饭,稀饭。此时作为具体食物可以继承Food抽象类,如果运用Bridge模式就不继承,采用聚合形式将强关联转变为若关联关系。

package com.wayne.bridge;public abstract class Food {protected FoodImpl foodImpl;public void toFull(){foodImpl.toFullImpl();}}package com.wayne.bridge;public abstract class FoodImpl {public abstract void toFullImpl();}package com.wayne.bridge;public class Rice extends FoodImpl {@Overridepublic void toFullImpl() {System.out.println("rice make me  full.......");}}package com.wayne.bridge;public class Noodle extends FoodImpl {@Overridepublic void toFullImpl() {System.out.println("noodles make me full.......");}}package com.wayne.bridge;public class DryFood extends Food {public DryFood(FoodImpl foodImpl) {this.foodImpl = foodImpl;}}package com.wayne.bridge;public class WedFood extends Food {public WedFood(FoodImpl foodImpl) {this.foodImpl = foodImpl;}}package com.wayne.bridge;public class Person {public static void main(String[] args) {//来一碗干饭Food food = new DryFood(new Rice());food.toFull();//来一碗汤面food = new WedFood(new Noodle());food.toFull();}}

?如果要炒饭或者炒面,那么只需要添加一个类继承Food?---> FryFood就可以了

?

Bridge模式就是分离抽象和实现,封装可变因素。

1 楼 banfry 2010-04-11 网上桥梁模式的例子很多,一直没看明白,还是lz的这个例子好,一看就明白,终于搞通了,谢谢分享。。。。 2 楼 banfry 2010-04-11 Rice和Noodle的接口中应该还有一个抽象方法,拿什么食品,实现各自的逻辑,不过这个方法在main函数中怎么调用呢? 3 楼 crawler 2010-04-11 banfry 写道Rice和Noodle的接口中应该还有一个抽象方法,拿什么食品,实现各自的逻辑,不过这个方法在main函数中怎么调用呢?
toFull()方法怎么调用就这么调用了,你如果想添加一个抽象方法再在Food中加一个方法通过FoodImpl来实现具体逻辑,一样的道理。

读书人网 >软件架构设计

热点推荐