Bridge 桥梁形式
Bridge 桥梁模式
toFull()方法怎么调用就这么调用了,你如果想添加一个抽象方法再在Food中加一个方法通过FoodImpl来实现具体逻辑,一样的道理。
《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 { @Override public void toFullImpl() { System.out.println("rice make me full......."); } } package com.wayne.bridge; public class Noodle extends FoodImpl { @Override public 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来实现具体逻辑,一样的道理。