適配器模式
說到適配器模式很多人第一反應就是android中的listview的adapter,哈哈,其實也有那麼點意思,適配器模式我們天天見卻不一定能夠發現:
什麼是適配器模式???
一、作用
適配器模式(Adapter):將一個類的接口轉換成客戶希望的另外一個接口,使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
二、適用場景
1. 業務的接口與工作的類不兼容,(比如:類中缺少實現接口的某些方法)但又需要兩者一起工作
2. 在現有接口和類的基礎上爲新的業務需求提供接口
概念:適配者模式是也是Android中應用很廣泛的設計模式,如我們常見用 BaseAdpter, ArrayAdapter, CursorAdapter,就是用的適配者模式;
分類:
適配器模式分三種類型:
1,類適配模式:
Usb接口
public interface Usb {
void store();
void takeAlong();
}
Phone類
- public class Phone {
- public void call() {
- System.out.println("Phone call");
- }
- public void sms() {
- System.out.println("Phone sms");
- }
- public void takeAlong() {
- System.out.println("Phone takeAlong");
- }
- }
public class Phone {
public void call() {
System.out.println("Phone call");
}
public void sms() {
System.out.println("Phone sms");
}
public void takeAlong() {
System.out.println("Phone takeAlong");
}
}
適配 Xiaomi 類
/**
* 類的適配器模式
* phone + Usb
* 將Phone的功能擴展到Usb裏
* @author xuzhaohu
*
*/
public class Xiaomi extends Phone implements Usb {
@Override
public void store() {
// TODO Auto-generated method stub
System.out.println("store implements usb");
}
}
/**
* 類的適配器模式
* phone + Usb
* 將Phone的功能擴展到Usb裏
* @author xuzhaohu
*
*/
public class Xiaomi extends Phone implements Usb {
@Override
public void store() {
// TODO Auto-generated method stub
System.out.println("store implements usb");
}
}
適配完後使用
Xiaomi mi1 = new Xiaomi();
mi1.takeAlong();
mi1.store();
Xiaomi mi1 = new Xiaomi();
mi1.takeAlong();
mi1.store();
輸出:
Phone takeAlong
store implements usb
這樣新的業務需求就可以通過適配的 Xiaomi類去滿足了。是不是覺得很簡單呢!!:) 有沒有其他的方式去實現同樣的功能呢?當然有,就是下面要講的對象適配模式。
2,對象適配模式
/**
* 對象的適配器模式
*
* @author xuzhaohu
*
*/
public class XiaomiWrapper implements Usb {
/**
* 1.創建一個Wrapper類,持有原類的一個實例,
* 2.在Wrapper類的方法中,調用實例的方法就行
*/
private Phone phone;
public XiaomiWrapper(Phone phone) {
this.phone = phone;
}
@Override
public void store() {
// TODO Auto-generated method stub
System.out.println("store implements usb");
}
@Override
public void takeAlong() {
// TODO Auto-generated method stub
phone.takeAlong();
}
}
調用方式:
- XiaomiWrapper mi2 = new XiaomiWrapper(new Phone());
- mi2.takeAlong();
- mi2.store();
(3)接口適配模式
- /**
- * 接口的適配器模式
- * 1.藉助於一個抽象類,該抽象類實現了該接口,實現了所有的方法
- * 2.繼承類可以選擇性的實現接口中的方法
- *
- * @author xuzhaohu
- *
- */
- public abstract class AbsPhone implements Usb {
- public void store() {
- System.out.println("AbsPhone implements usb's store methond");
- }
- public void takeAlong() {
- System.out.println("AbsPhone implements usb's takeAlong methond");
- }
- }
/** * 接口的適配器模式 * 1.藉助於一個抽象類,該抽象類實現了該接口,實現了所有的方法 * 2.繼承類可以選擇性的實現接口中的方法 * * @author xuzhaohu * */ public abstract class AbsPhone implements Usb { public void store() { System.out.println("AbsPhone implements usb's store methond"); } public void takeAlong() { System.out.println("AbsPhone implements usb's takeAlong methond"); } }
適配類只跟AbsPhone打交道,根本不需要關心接口的行爲,只顯示自己所要關注的。
如Phone1適配只需要store()行爲
- public class Phone1 extends AbsPhone {
- public void call() {
- System.out.println("Phone1 call");
- }
- public void sms() {
- System.out.println("Phone1 sms");
- }
- public void store() {
- System.out.println("Phone1 need usb's store methond");
- }
- }
public class Phone1 extends AbsPhone {
public void call() {
System.out.println("Phone1 call");
}
public void sms() {
System.out.println("Phone1 sms");
}
public void store() {
System.out.println("Phone1 need usb's store methond");
}
}
Phone2適配只需要takeAlong()行爲
- public class Phone2 extends AbsPhone {
- public void call() {
- System.out.println("Phone2 call");
- }
- public void sms() {
- System.out.println("Phone2 sms");
- }
- public void takeAlong() {
- System.out.println("Phone2 need usb's takeAlong methond");
- }
- }
public class Phone2 extends AbsPhone {
public void call() {
System.out.println("Phone2 call");
}
public void sms() {
System.out.println("Phone2 sms");
}
public void takeAlong() {
System.out.println("Phone2 need usb's takeAlong methond");
}
}
實例化調用
- Phone1 p1 = new Phone1();
- Phone2 p2 = new Phone2();
- p1.store();
- p2.takeAlong();
Phone1 p1 = new Phone1();
Phone2 p2 = new Phone2();
p1.store();
p2.takeAlong();
輸出:
Phone1 need usb's store methond
Phone2 need usb's takeAlong methond
來一次完整的調用
- Phone1 p1 = new Phone1();
- Phone2 p2 = new Phone2();
- p1.store();
- p1.takeAlong();
- p2.takeAlong();
- p2.store();
Phone1 p1 = new Phone1();
Phone2 p2 = new Phone2();
p1.store();
p1.takeAlong();
p2.takeAlong();
p2.store();
輸出:
Phone1 need usb's store methond
AbsPhone implements usb's takeAlong methond
Phone2 need usb's takeAlong methond
AbsPhone implements usb's store methond
這樣很清晰的知道適配的什麼方法了。