設計模式之適配器模式

以下情況使用適配器模式
你想使用一個已經存在的類,而它的接口不符合你的需求。
你想創建一個可以複用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。
(僅適用於對象Adapter)你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口。

160117732.jpg


其中目標接口target:

// 目標接口,或稱爲標準接口
package com.nudt.design.adapter;

/**
 * Created by jeffrey on 15-12-2.
 */
public interface Target {
    public void request();
}

被適配類Adaptee

// 已存在的、具有特殊功能、但不符合我們既有的標準接口的被適配類
package com.nudt.design.adapter;

/**
 * Created by jeffrey on 15-12-2.
 */
public class Adaptee {
    public void commonRequest(){
        System.out.println("common function!");
    };
}

第一種:適配器Adapter(繼承模式):

// 適配器類,繼承了被適配類,同時實現標準的目標接口
package com.nudt.design.adapter;

/**
 * Created by jeffrey on 15-12-2.
 */
public class AdapterExtends extends Adaptee implements Target {
    @Override
    public void request() {
        System.out.println("after extends");
        this.commonRequest();
    }
}

第二種:適配器Adapter(組合模式):

//通過繼承目標標準接口,然後講通用的被適配類作爲成員變量組合進去
package com.nudt.design.adapter;

/**
 * Created by jeffrey on 15-12-2.
 */
public class AdapterZuhe implements Target {

    private Adaptee special;
    public AdapterZuhe(Adaptee special){
        this.special = special;
    }
    @Override
    public void request() {
        System.out.println("after zuhe!");
        special.commonRequest();
    }
}

測試類:

package com.nudt.design.adapter;

/**
 * Created by jeffrey on 15-12-2.
 */
public class NoteBook {
    //private Target concreteTarget;
    private Target target;
    //private Adaptee adaptee;
    public NoteBook(Target target){
        this.target = target;
    }
    public void request(){
        target.request();
    }

    public static void main(String[] args) {
        //只有一個普通的工具
        Adaptee adaptee = new Adaptee();
        //要實現特殊功能
        //方式一:採用組合的方式
        Target target = new AdapterZuhe(adaptee);
        NoteBook nb1 = new NoteBook(target);
        nb1.request();
        //方式二:採用繼承的方式
        Target target2 = new AdapterExtends();
        NoteBook nb2 = new NoteBook(target2);
        nb2.request();
    }
}

最關鍵的一句話:繼承被適配類,同時實現目標接口


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章