先舉一個例子解釋一下生活中的適配器模式:公司老總要求工程部經理來彙報一下公司內部的消防設備使用和維護狀況。接到通知後,工程部經理老宋找了專門負責消防設備統計的維護人員小王,請他調出了去年整年的維護記錄。而後老宋前去向總經理彙報工做。函數
在這個例子中,總經理的任務是:找工程部經理(接口)瞭解一下消防設備的狀況,他可能並不記得誰是工程部經理。老宋(實現類,適配器)發現小王(適配者)其實能夠解決這個問題,因而他要求小王提供數據並親自向總經理作了彙報。對總經理而言,他並不關心工程部經理的具體工做。整個過程當中,總經理、老宋、小王三者的角色缺一不可。若是老宋沒有找小王而是本身統計,僅屬於接口實現。若是老宋讓小王直接去彙報,也不屬於適配器模式。設計
適配器模式的UML關係圖以下:對象
使用者須要調用Target接口的Request(),完成具體工做的實際上是Adaptee類的SpecRequest()。Adapter類實現Request(),持有Adaptee對象並調用了它的方法。blog
在熟悉了適配器模式的特色之後,咱們來看一個JDK中的例子:InputStreamReader。繼承
InputStreamReader是字節流通向字符流的橋樑,它繼承了Reader並使用InputStream做爲構造函數的參數。在InputStreamReader內部經過nio的方法將字節數據轉換成了字符數據。接口
一樣OutputStreamWriter的設計也屬於適配器模式。get