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 {

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

你可能感兴趣的:(bridge)