擴充卡設計模式的概念
擴充卡模式是把一個類的接口變成使用者所期待的另一個接口,進而使得原本因為接口不比對無法一起工作的兩個類一起工作!
擴充卡的用途
比如我們的筆記本的插頭通常是三相的,除了陰極,陽極外還有地極。而有些地方的插座隻有兩級,沒有地極。電源插座與筆記本的電源插頭因為不比對而無法使用。
一個三相到兩相的轉換器(擴充卡)就能解決問題。這正是擴充卡模式所要解決的問題。
擴充卡模式的結構
擴充卡模式有類擴充卡模式和對象擴充卡模式兩種
類适配模式
類适配模式是把适配類的api适配成目标類的api。
從上圖可以看得出來,Adaptee沒有simpleOperation2()方法,而使用者需要有這個方法。了使使用者能夠使用Adaptee類就需要一個中間環節,即利用Adapter把
Target的api與Adaptee的api連接配接起來。由于Adapter繼承Adaptee,是以決定了這個模式是類适配模式。
模式所涉及的角色:
目标角色(Target):這就是所帶得到的接口。注意因為這裡是讨論擴充卡模式,是以隻能是接口,不能是類。
源角色(adaptee):現在需要适配的接口(或類);
擴充卡角色(adapter):把源接口轉變成目标接口的具體類。
源碼 :
目标角色:
public interface Target {
//源類也有的方法
public void simpleOperation1();
//源類沒有的方法
public void simpleOperation2();
}
源角色:
public class Adaptee {
public void simpleOperation1(){
System.out.println("adaptee simpleOperation1");
}
}
擴充卡角色:
public class Adapter extends Adaptee implements Target{
//補充源類相對目标類沒有的方法
@Override
public void simpleOperation2() {
System.out.println("adapter simpeOperation2");
}
}
用戶端角色:
public class Client {
public void run(Target target){
target.simpleOperation1();
target.simpleOperation2();
}
}
測試代碼:
public class TestAdapter {
public static void main(String[] args) {
Target target=new Adapter();
new Client().run(target);
}
}
測試結果:
adaptee simpleOperation1
adapter simpeOperation2
對象适配模式
對象适配模式與類适配模式一樣,也是将适配類的api轉換成目标類的api,不同于類适配模式的是,對象适配模式不是通過繼承的方式連接配接到Adaptee,而是通過将任務
委派的關系連接配接到Adaptee。
從上圖可以看出,adaptee中并沒有缺少sampleOperation2()方法。為了使用Adaptee需要一個包裝(wrapper)類,這個包裝類包含一個Adaptee的執行個體。從
而将Adaptee與target聯系起來。正因為這層關系,是以這個模式為對象适配模式。
源碼:
目标角色:
public interface Target {
//源類也有的方法
public void simpleOperation1();
//源類沒有的方法
public void simpleOperation2();
}
源角色:
public class Adaptee {
public void simpleOperation1(){
System.out.println("adaptee simpleOperation1");
}
}
擴充卡角色
public class Adapter implements Target{
Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee=adaptee;
}
@Override
public void simpleOperation1() {
adaptee.simpleOperation1();
}
@Override
public void simpleOperation2() {
System.out.println("adapter simpeOperation2");
}
}
用戶端角色:
public class Client {
public void run(Target target){
target.simpleOperation1();
target.simpleOperation2();
}
}
測試代碼:
public class TestAdapter {
public static void main(String[] args) {
Target target=new Adapter(new Adaptee());
new Client().run(target);
}
}
測是結果:
adaptee simpleOperation1
adapter simpeOperation2
預設适配(default adapter)模式
預設适配模式:定義一個類為目标接口所有的方法提供預設實作,這樣子類就可以從這個預設類進行擴充。不必從目标接口進行擴充。
源碼:
目标角色:
public interface Target {
//源類也有的方法
public void simpleOperation1();
//源類沒有的方法
public void simpleOperation2();
}
預設擴充卡:
public class Adapter1 implements Target{
@Override
public void simpleOperation1() {
// TODO Auto-generated method stub
}
@Override
public void simpleOperation2() {
// TODO Auto-generated method stub
}
}
擴充類:
public class Adaptee1 extends Adapter1{
@Override
public void simpleOperation1() {
// TODO Auto-generated method stub
super.simpleOperation1();
System.out.println("adaptee simpleOperation1");
}
}
測試代碼
public class TestAdapter {
public static void main(String[] args) {
Target target=new Adaptee1();
new Client().run(target);
}
}
測試結果:
adaptee simpleOperation1
适配模式的優缺點:
1,更好的複用性:
系統需要使用現有的類,而現有的類不符合系統接口的要求,通過适配可以使現有類得到很好的複用。
2,更好的擴充功能:
在适配功能時,可以調用自己開發的功能,進而擴充系統的功能。
3,過多的使用擴充卡,會使得系統非常混亂,不易整體把握。(試想一下,明明看到的是A接口,實作的卻是B接口)