桥接(Bridge)模式
将抽象与实现部分分离,使得他们都可以独立的变化。又称为接口(Interface)模式
体现了单一职责、开闭、合成复用、里氏代换、依赖倒转原则。
如何使用:
1、识别出一个类所具有的两个独立变化的维度,将他们设计成两个独立的继承等级结构;为两个维度都提供抽象层,并建立抽象耦合;
结构图
Abstraction: 定义抽象类接口,一般是抽象类不是接口;同时定义一个Implementor类型对象,关联关系
RefinedAbstraction:实现抽象类声明的抽象业务方法,并可以调用在Implementor中定义的业务方法;
Implementor: 定义类接口,仅对操作做声明,具体子类去实现;
ConcreteImplementor:具体实现类;程序运行时,会替换到父类对象,提供给抽象类具有的业务操作方法;
典型样例
代码样例
public class Client { // 客户端通过灵活绑定不同的操作系统类Impl public static void main(String args[])
{
// TODO: 此处应该实现成XML读取,并借助反射实例化上述类
Image image = new JPGImage();
ImageImpl impl = new LinuxImpl(); image.setImageImpl(impl); File file = new File(""); image.parseFile(file); } }
抽象操作系统实现类接口
public interface ImageImpl { public void doPaint(); }
具体实现类
public class LinuxImpl implements ImageImpl{ @Override public void doPaint() { System.out.println("在Linux环境绘制"); } } public class UnixImpl implements ImageImpl{ @Override public void doPaint() { System.out.println("在unix环境绘制"); } } public class WindowsImpl implements ImageImpl { @Override public void doPaint() { System.out.println("在Windows环境绘制"); } }
图象抽象类
public abstract class Image { protected ImageImpl impl; public void setImageImpl(ImageImpl impl) { this.impl = impl; }
// 子类中调用传入的ImageImpl实例化类,完成灵活的不用操作系统实现体的调用 public abstract void parseFile(File filename); }
具体实现类
public class JPGImage extends Image { @Override public void parseFile(File filename) { impl.doPaint(); System.out.println("File type: JPG" ); } } public class PNGImage extends Image { @Override public void parseFile(File filename) { impl.doPaint(); System.out.println("File type: PNG"); } }