1. 程式人生 > 其它 >設計模式之 介面卡模式

設計模式之 介面卡模式

介面卡模式適合用來解決不同系統之間的對接問題。

介面卡模式通過定義一個介面卡類作為兩個不相容的介面之間的橋樑,將一個類的介面轉換成使用者期望的另一個介面,使得兩個或多個原本不相容的介面可以基於介面卡類一起工作。

1. 類介面卡模式

在不改變原有介面或類結構的情況下擴充套件類的功能以適配不同的介面時,可以使用類介面卡模式。類介面卡模式通過建立一個繼承原有類(需要擴充套件的類)並實現新介面來實現。

(1)原類

public class Source{
    private final static Log logger = LogFactory.getLog(Source.class);
    
public void editTextFile(){ logger.info("a text file editing"); } }

(2)定義Targetable介面

public interface Targetable{
    void editTextFile();
    void editWordFile();
}

(3)定義Adapter繼承Source並實現Targetable介面

public class Adapter extends Source implements Targetable{
    private final static
Log logger = LogFactory.getLog(Adapter.class); @Override public void editWordFile(){ logger.info("a word file editing"); } }

(4)使用類的介面卡

public static void main(String[] args){
    Targetable target = new Adapter();
    target.editTextFile();
    target.editWordFile();
}

2. 物件介面卡

和類介面卡思路基本相同,只是修改了Adapter類。

(1)介面卡類定義

public class ObjectAdapter extends Source implements Targetable{
    private final static Log logger = LogFactory.getLog(ObjectAdapter.class);
    
    private Source source;
    
    public ObjectAdapter(Source source){
        super();
        this.source = source;
    }
    
    @Override
    public void editTextFile(){
        this.source.editTextFile();
    }
    
    @Override
    public void editWordFile(){
        logger.info("a word file editing");
    }
}

(2)使用物件介面卡模式

Source source = new Source();
Targetable target = new ObjectAdapter();
target.editTextFile();
target.editWordFile();

3. 介面介面卡模式

在不希望實現一個介面的所有方法時,可以建立一個抽象類實現所有方法,在使用時繼承該抽象類按需實現方法即可。

(1)定義公共介面Sourceable

public class Sourceable{
    void editTextFile();
    void editWordFile();
}

(2)定義抽象類並實現公共介面

public abstract class AbstractAdapter implements Sourceable{
    @Override
    public void editTextFile(){}
    @Override
    public void editWordFile(){}
}

(3)實現需求editTextFile()

public class SourceSub1 extends AbstractAdapter{
    private final static Log logger = LogFactory.getLog(SourceSub1.class);
    
    @Override
    public void editTextFile(){
        logger.info("a text file editing");
    }
}

(4)實現需求editWordFile()

public class SourceSub2 extends AbstractAdapter{
    private final static Log logger = LogFactory.getLog(SourceSub2.class);
    
    @Override
    public void editWordFile(){
        logger.info("a word file editing");
    }
}

(5)使用介面介面卡

public static void main(String[] args){
    Sourceable source1 = new SourceSub1();
    Sourceable source2 = new SourceSub2();
    source1.editTextFile();
    source2.editWordFile();
}