Java設計模式之適配器模式(Adapter)

上課的時候不能擼其它代碼,只能看下java設計模式的書,網上也有很多總結好的,但覺得自己總結一遍能收穫的更多,下來慢慢總結下這些設計模式。之所以叫接口型模式,是因爲這些設計模式都需要用到Interface。
適配器模式的意圖
使用不同接口的類所提供的服務爲客戶端提供它所期望的接口
Adapter之類的適配器
比如一個客戶找到黑貓要一件衣服,要求這件衣服必須要有拉鍊,釦子,高領(interface),但是黑貓我呢只有模板是拉鍊和釦子的(現有具體類),沒有高領的,但是如果重新定義滿足客戶的要求的工作是很麻煩的,而且浪費空間,不能重用,那麼現在就要用到類的適配器了,就是我們再弄一個子類來適配現有類(模板)去滿足這個interface,關係圖太麻煩,小長我還在學習中啊,直接寫個代碼總結吧
客戶要求的功能(interface)

public interface Client {
    public void laLian();
    public void kouZi();
    public void gaoLin();
}

黑貓小長現在有的模板(現有類)

//看嘛,現在是不是沒有高領,客戶不幹啊
public class NowHave {
    public void laLian(){
        System.out.println("我有拉鍊");
    }
    public void kouZi(){
        System.out.println("我有釦子");
    }
}

弄個小弟來適配現有模板去滿足客戶

//你要滿足,肯定要實現這個接口澀,利用現有的模板當然要繼承他了,最後
public class Adapter extends NowHave implements Client{

    @Override
    public void gaoLin() {
        // TODO Auto-generated method stub
        System.out.println("我有高領了");
    }

}

測試一下

//多態的知識,就滿足了
public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Client cl = new Adapter();
        cl.gaoLin();
        cl.kouZi();
        cl.laLian();
    }

}

Adapter之對象適配器
就是咱們可以間接利用適配器類去用咱有現有類的實例,比如咱們現有模板有一個方法是吧,但是客戶要求的方法呢和這個名字不一樣,但是要用到模板裏的這個方法,咱就用適配器類來返回現有類的實例,通過這個實例調用這個需要用到的方法。直接上個例子:
要求類

//客戶要求的內容
public abstract class RequredClass {
    public abstract String requiredMethod();
}

黑貓現在有的,並且是客戶要求的可以用到的

//俺現在有的類,裏面有個方法呢是要求類要用到的
public class ExistClass {
    public String  userfulMethod(){
        /*
         *內容 
         */
        return null;
    }
}

適配唄

//咱們來適配
public class Adapter extends RequredClass{
    //既然是對象適配器,要用到已有類的對象澀,定義一個先
    private ExistClass existClass;
    public Adapter(ExistClass existClass){
        this.existClass = existClass;
    }

    @Override
    public String requiredMethod() {
        // TODO Auto-generated method stub
        return existClass.userfulMethod();
    }
}

對象適配器更加脆弱
爲啥子呢?對象適配器,俺們的適配器類沒有繼承接口,沒有接口的約束,可能在運行時出現編譯時無法檢測到的問題,而且俺們不能想訪問現有類的屬性或方法,不能保證咱們現有類的屬性或方法的聲明方式,很難約束控制它們要做的事情。
Adapter之缺省適配器
就是客戶本來要求很多功能,但是現在只需要一個功能了,不多說,直接上代碼
要求的接口

//目標接口
public interface Target {
    public void method1();
    public void method2();
    public void method3();
}

再定義一個類繼承上面的(只是一箇中間過渡類)

public class GuoDu implements Target{

    //所有方法不必去實現
    @Override
    public void method1() {
        // TODO Auto-generated method stub

    }

    @Override
    public void method2() {
        // TODO Auto-generated method stub

    }

    @Override
    public void method3() {
        // TODO Auto-generated method stub

    }

}

客戶只要method3的功能,咱們就只有method3澀

public class FunctionClass extends GuoDu {
    public void method3(){
        /*
         * 具體功能
         * */
    }
}

再來一個測試類

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Target target = new FunctionClass();
        target.method2();
    }

}
//你去調用method1和method2是沒有效果的,因爲俺們的功能類沒有實現這個,這就是需要哪個,咱就重寫哪個方法

Adapter應用場景
如果一個抽象類或者接口的話,就必須要重寫所有的抽象方法。
那麼,如果一個接口中定義的抽象方法過多,而子類中很多抽象方法又不需要用到,就應該設計一個適配器。在JAVA的GUI編程中,jdk就自動封裝了多個適配器。比如: windowAdapter。

發佈了36 篇原創文章 · 獲贊 30 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章