桥接模式是指:将抽象部分与它的实现分离,使他们都可以独立地变化.
将抽象部分与其实现部分分开,使之任意增减,而无须受其他约束
实例1
Abstraction:定义抽象类的接口,维护一个指向Implementor类型对象的指针,将Client的请求转发给他的Implementor.RefinedAbsreaction扩充由Abstraction定义接口
Implementor:定义实现类的接口,该接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同,一般来讲.Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作
ConcreteImplementor:实现Implementor接口定义它的具体实现
实例2
比如我们日常生活中经常使用的门,从其材质角度划分克包括塑料门,塑钢门,木门,从其形式角度划分可包括平开门、推拉门、折叠门.
门即Abstraction," 塑料门、塑钢门、木门" 即RefinedAbstraction,“门的实现”即Implementor."平开门的实现、推拉门的实现、折叠门的实现"即ConcreteImplemtor
桥接具备以下一些优势
使接口与实现各自独立
使接口实现类的扩展性大大增强
保护部分实现内容,在扩展与变更实现内容时,无须重新编译原客户程序。
基于此,我认为可以再以下几种情形下采用桥接模式进行软件设计与实现
需要增强抽象角色与具体的灵活性以避免两者之间的直接关联
实现类的变动,不影响客户端的使用
抽象接口与刘的实现通过组合,均可在子类上进行扩展
示例3.
package model.bredge;
/*
* Implementor(HouseImp)定义实现类接口,该接口不一定要与Abstrctioin的接口完全一致
* 事实上这两个接口可以完全不同,一般来讲Implementor接口仅提供基本操作,Abstrction则定义了这些
*/
public interface HouseImpl {
public String doShow(String str);
}
package model.bredge;
/*
* abstraction 定义抽象类的接口,维护一个指向实现者(implementor)接口类型(HouseImp)
*/
public abstract class House {
protected HouseImpl houseImpl;
public String setHouseImpl(HouseImpl hi){
houseImpl = hi;
return null;
}
public abstract String method(String str);
}
package model.bredge;
/*
* 房子扩展类
* RefinedAbstrcion(ExtensionHouse)扩充由Abstraction定义接口
*/
public class ExtensionHouse extends House{
public String method(String strExtension){
String e=strExtension+"\nEXTENSION HOUSE";
return this.houseImpl.doShow(e);
}
}
package model.bredge;
/*
* 公寓的实现
*/
public class FlatImp implements HouseImpl{
@Override
public String doShow(String str) {
String a = "房子属于公寓";
System.out.println(str+"房子属于公寓");
return a;
}
}
package model.bredge;
/*
* Implementor(HouseImp)定义实现类接口,该接口不一定要与Abstrctioin的接口完全一致
* 事实上这两个接口可以完全不同,一般来讲Implementor接口仅提供基本操作,Abstrction则定义了这些
*/
public interface HouseImpl {
public String doShow(String str);
}
package model.bredge;
/*
* 客户端程序类
*/
public class test {
public static void main(String[] args) {
FlatImp flatImp = new FlatImp();
ExtensionHouse extensionHouse = new ExtensionHouse();
extensionHouse.setHouseImpl(flatImp);
extensionHouse.method("show1:");
//这里其实就用到了里氏替换原则
VillaImp villaImp = new VillaImp();
extensionHouse.setHouseImpl(villaImp);
extensionHouse.method("show2:");
}
}