桥接模式(Bridge):将抽象的部分和它的实现部分分离,使他们都可以独立的变化。
模式的角色:Abstraction:定义抽象类的接口,维护一个指向Implementor类型对象的指针,将Client端的请求转发给它的Implementor
RefinedAbstraction:扩充有Adstraction定义的接口。Implementor:定义实现类的接口,该接口不一定要与Abstraction一致,事实上这两个接口可以完全不一样,一般来讲,Implementor接口仅提供 基本操作,
Abstraction则定义这些基本操作较高层次的操作。
ConcreteImplementor:实现Implementor接口并定义它的具体实现。
实例:
当代社会,房子是老百姓的头等大事,可以运用桥接模式实现房子与公寓、别墅之间的关系。
房子抽象类
public abstract class House
{
protected HouseImp houseImp;
public String setHouseImp(HouseImp hi)
{
houseImp =hi;
return null;
}
public abstract String method(String str);
}
房子扩展类
public class ExtensionHouse extends House
{
public String method(String str)
{
String e= str+"\n EXTENSION HOUSE";
return houseImp.doShow(e);
}
}
房子实现类接口
public interface HouseImp
{
public String doShow(String strHouse);
}
公寓实现类
public class FlatImp implements HouseImp
{
public String doShow(String strHouse)
{
return strHouse+"公寓";
}
}
别墅实现类
public class VillaImp implements HouseImp
{
public String doShow(String strHouse)
{
return strHouse+"别墅";
}
}
测试类
public class TestBridge
{
public static void main(String[] args)
{
HouseImp villa = new VillaImp();
ExtensionHouse ext1 = new ExtensionHouse();
ext1.setHouseImp(villa);
ext1.method("Show1");
HouseImp flat= new FlatImp();
ExtensionHouse ext2 = new ExtensionHouse();
ext2.setHouseImp(flat);
ext2.method("Show2");
}
}
优势:使接口和实现相互独立。
是接口实现类的扩展性大大的增强。
保护部分实现内容,在扩展或者变更实现内容时,无需重新编译原客户端程序。
使用场景:
需要增强抽象角色和具体角色之间的灵活性,以避免两者之间直接关联。
实现类的变动,不影响客户端的使用。
抽象接口和具体实现通过组合,均可以在子类上进行扩展。