一天一種設計模式之四-----適配器模式

一.適配器模式

  1. 適配器模式屬於結構型模式java

  2. 定義:將一個類的接口轉換成客戶但願的另一個接口。適配器模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做ide

  3. 使用場景:測試

    1. 你想使用一個已經存在的類,而他的接口不符合你的要求。this

    2. 你想建立一個能夠複用的類,該類能夠與其餘不相關或不可預見的類(即那些接口可能不兼容的類)協同工做spa

    3. 你想使用一些已經存在的子類,可是不可能對每個都進行子類話以匹配他們的接口。對象適配器能夠適配它的父類接口設計

  4. 結構:代理

    1. target:定義client使用的與特定領域相關的接口code

    2. client:與符合target接口的對象協同對象

    3. Adaptee:定義一個已經存在的接口,這個接口須要適配。繼承

    4. Adapter:對Adaptee的接口與target接口進行適配。

  5. 適配器模式是一種補償機制,雖然他有不少優勢,但這是在後期發現原有類不知足擴展需求所作的一種妥協,因此不推薦設計初期使用。

  6. 下面的方法經過在類adapter中聲明一個adaptee來實現,被稱爲對象適配器;也能夠經過繼承adaptee類實現,被稱爲類適配器,不過java只支持單繼承,因此不推薦類適配器。

二.測試代碼

    public static void main(String[] args) {
        Target target=new Adapter(new Adaptee());
        target.adapteeMethod();
        target.adapterMethod();
    }
}
interface Target{
    void adapteeMethod();
    void adapterMethod();
}
class Adaptee{
    public void adapteeMethod(){
        System.out.println("adaptee method");
    }
    
}
class Adapter implements Target{
    private Adaptee adaptee;
    public Adapter(Adaptee adaptee){
        this.adaptee=adaptee;
    }
    @Override
    public void adapteeMethod() {
        adaptee.adapteeMethod();
    }

    @Override
    public void adapterMethod() {
        adaptee.adapteeMethod();
    }
    
}

下面這段測試代碼模擬的是不一樣人不一樣的起名習慣,在不違背開放封閉原則的基礎上統一爲同一習慣,適配爲一種接口的適配器模式,是否是感受很像代理模式?

下節將講代理模式,包括靜態代理、動態代理、以及代理模式和適配器模式的區別。內容應該比較多因此須要兩天才能更新吧,敬請期待。

public class ShipeiqiTest {
    public static void main(String[] args) {
        BaseService service=new VisitorImpl(new VisitorServiceImpl());
        service.update();
    }
}
//習慣1 target
interface BaseService {
    void insert();
    void update();
}

class AdminServiceImp implements BaseService {
    @Override
    public void insert() {
    }
    @Override
    public void update() {
    }
}
//習慣二 被適配者 adaptee
interface DaoService {
    void insert();
}

class VisitorServiceImpl implements DaoService {
    @Override
    public void insert() {
    }
}
//適配器 adapter
class VisitorImpl implements BaseService {
    DaoService service;
    public VisitorImpl(DaoService service) {
        this.service = service;
    }
    @Override
    public void insert() {
        service.insert();
    }
    @Override
    public void update() {
    }
}
相關文章
相關標籤/搜索