以下情況使用適配器模式
你想使用一個已經存在的類,而它的接口不符合你的需求。
你想創建一個可以複用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。
(僅適用於對象Adapter)你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口。
其中目標接口target:
// 目標接口,或稱爲標準接口 package com.nudt.design.adapter; /** * Created by jeffrey on 15-12-2. */ public interface Target { public void request(); }
被適配類Adaptee
// 已存在的、具有特殊功能、但不符合我們既有的標準接口的被適配類 package com.nudt.design.adapter; /** * Created by jeffrey on 15-12-2. */ public class Adaptee { public void commonRequest(){ System.out.println("common function!"); }; }
第一種:適配器Adapter(繼承模式):
// 適配器類,繼承了被適配類,同時實現標準的目標接口 package com.nudt.design.adapter; /** * Created by jeffrey on 15-12-2. */ public class AdapterExtends extends Adaptee implements Target { @Override public void request() { System.out.println("after extends"); this.commonRequest(); } }
第二種:適配器Adapter(組合模式):
//通過繼承目標標準接口,然後講通用的被適配類作爲成員變量組合進去 package com.nudt.design.adapter; /** * Created by jeffrey on 15-12-2. */ public class AdapterZuhe implements Target { private Adaptee special; public AdapterZuhe(Adaptee special){ this.special = special; } @Override public void request() { System.out.println("after zuhe!"); special.commonRequest(); } }
測試類:
package com.nudt.design.adapter; /** * Created by jeffrey on 15-12-2. */ public class NoteBook { //private Target concreteTarget; private Target target; //private Adaptee adaptee; public NoteBook(Target target){ this.target = target; } public void request(){ target.request(); } public static void main(String[] args) { //只有一個普通的工具 Adaptee adaptee = new Adaptee(); //要實現特殊功能 //方式一:採用組合的方式 Target target = new AdapterZuhe(adaptee); NoteBook nb1 = new NoteBook(target); nb1.request(); //方式二:採用繼承的方式 Target target2 = new AdapterExtends(); NoteBook nb2 = new NoteBook(target2); nb2.request(); } }
最關鍵的一句話:繼承被適配類,同時實現目標接口