將抽象與實現部分分離,使得他們均可以獨立的變化。又稱爲接口(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"); } }