《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模式就是分离抽象和实现,封装可变因素。