将抽象与实现部分分离,使得他们均可以独立的变化。又称为接口(Interface)模式ide
体现了单一职责、开闭、合成复用、里氏代换、依赖倒转原则。this
一、识别出一个类所具备的两个独立变化的维度,将他们设计成两个独立的继承等级结构;为两个维度都提供抽象层,并创建抽象耦合;spa
Abstraction: 定义抽象类接口,通常是抽象类不是接口;同时定义一个Implementor类型对象,关联关系操作系统
RefinedAbstraction:实现抽象类声明的抽象业务方法,并能够调用在Implementor中定义的业务方法;设计
Implementor: 定义类接口,仅对操做作声明,具体子类去实现;3d
ConcreteImplementor:具体实现类;程序运行时,会替换到父类对象,提供给抽象类具备的业务操做方法;unix
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); } }
抽象操做系统实现类接口code
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环境绘制"); } }
图象抽象类blog
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"); } }