天天看點

擴充卡設計模式(Adapter)

     擴充卡設計模式的概念

            擴充卡模式是把一個類的接口變成使用者所期待的另一個接口,進而使得原本因為接口不比對無法一起工作的兩個類一起工作!

     擴充卡的用途

            比如我們的筆記本的插頭通常是三相的,除了陰極,陽極外還有地極。而有些地方的插座隻有兩級,沒有地極。電源插座與筆記本的電源插頭因為不比對而無法使用。

一個三相到兩相的轉換器(擴充卡)就能解決問題。這正是擴充卡模式所要解決的問題。

     擴充卡模式的結構

            擴充卡模式有類擴充卡模式和對象擴充卡模式兩種

     類适配模式

            類适配模式是把适配類的api适配成目标類的api。

擴充卡設計模式(Adapter)

        從上圖可以看得出來,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。

擴充卡設計模式(Adapter)

       從上圖可以看出,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接口)

繼續閱讀