適配器設計模式的角色
1、目標接口:當前業務所期待的接口,可以是抽象類或接口
2、適配者,它是被訪問和適配的現存組件庫中的組件接口
3、適配器,相當於一個轉換器,通過過繼承或引用適配者的對象,把適配者接口轉換成目標接口,讓客戶按目標接口的格式訪問適配者。
通過一個例子談談適配器模式吧
1、我們先定義一個小學生守則接口 , 所有的小學生都必須遵守
//學生守則接口
public interface StudentNorm {
//考試後家長簽字
public void doSome();
//一週看一次免費電影
public void doOther();
}
2、接着我們創建一個小學生類實現這個接口
public class Student implements studentNorm{
//顯然在這裏我們必須重寫接口中的所有方法
doSome(){
...
}
doOther(){
...
}
}
那麼我們現在把自己想成小學生。 我們只想沒周看一次免費電影 , 不想考試後給家長簽字, 怎麼辦 。
這個時候我們的適配者就出場 。 我們的小學生走在路上碰到一個小商販 , 靈機一動 , 喊了一身 “爸爸”
這個時候 “爸爸”(小商販)見兒子(小學生)有難不能不幫啊,怎麼幫呢?
//小商販類
public class person implements StudentNorm{
//顯然小商販事先學生守則接口後也需要重寫接口中的所有方法。但是此時小學生如果繼承person還是需要重寫父類中的所有方法。
doSome(){
...
}
doOther(){
...
}
}
這裏我們的適配器設計模式就出現了
public abstract class preson implements StudentNorm {
@Override
public void doSome() {
System.out.println("開始後家長簽字,實際籤的是老爸");
}
}
將我們的適配者也就是小商販定義爲抽象類,此時abstract修飾的類可以選擇性的重寫實現接口中的方法 …此時我們的小學生來繼承person
//此時如果小學生實現了StudentNorm 則必須實現該接口中所有的方法
//那麼如果現在只是讓下學生一週看一次免費電影 而不用考試後家長簽字 所以此時需要
//一個 ”中間人“ 這個人既可以幫助我們選擇我們需要的功能也可以幫助我們避免我們需要實現的功能
public class Student extends preson{
@Override
public void doOther() {
System.out.println("小學生一週可以看一次免費電影, 實際看的是兒子");
}
}
test:
public class TestMain {
public static void main(String[] args) {
StudentNorm mike = new Student();
mike.doSome();
mike.doOther();
}
}
通過這裏例子很清晰的說明當我們的目標類 , 需要添加某個功能或者方法的時候,而我們的此時並不是需要接口中的所有功能,此時就可以採用我們的適配器 , 定義一個適配者中間轉換器來讓我們的目標類繼承或者實現我們的適配者 , 完成功能的添加