博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之适配器模式(Adapter)
阅读量:5142 次
发布时间:2019-06-13

本文共 2902 字,大约阅读时间需要 9 分钟。

设计模式之适配器模式(Adapter)

场景

您的存储卡中有一些照片,需要将它们传输到计算机上。为了传输它们,您需要某种与计算机端口兼容的适配器,以便将存储卡连接到计算机。在这种情况下,读卡器是适配器。另一个例子是着名的电源适配器; 三脚插头不能连接到双管插座,需要使用电源适配器使其与双叉插座兼容。另一个例子是翻译人员将一个人所说的话翻译成另一个人

维基百科

允许将现有类的接口用作另一个接口。它通常用于使现有类与其他类一起工作而无需修改其源代码。(适配器模式允许您将其他不兼容的对象包装在适配器中,以使其与另一个类兼容。)

以下示例场景

汉语翻译成英语

类适配器

通过继承来实现适配器功能

public class SpeakChinese {    public void speakChinese(){        System.out.println("说汉语...");    }}
public interface SpeakEnglish {    void speakEnglish();}
public class Translation extends SpeakChinese implements SpeakEnglish {    @Override    public void speakEnglish() {        speakChinese();        System.out.println("===translation===");        System.out.println("Speak English...");    }}
@Test    public void clazz(){        SpeakEnglish speakEnglish = new Translation();        speakEnglish.speakEnglish();    }

类图如下所示

类适配器的把SpeakChinese中的方法暴露给了适配器,使用起来成本增加

对象适配器

原理:通过组合来实现适配器功能。

public class TranslationObjectAdapter implements SpeakEnglish {    private SpeakChinese speakChinese;    public TranslationObjectAdapter(SpeakChinese speakChinese) {        this.speakChinese = speakChinese;    }    @Override    public void speakEnglish() {        speakChinese.speakChinese();        System.out.println("===translation===");        System.out.println("Speak English...");    }}

测试

@Test    public void objectTest(){        SpeakEnglish speakEnglish = new TranslationObjectAdapter(new SpeakChinese());        speakEnglish.speakEnglish();    }

类图如下:

对象适配器和类适配器其实算是同一种思想,只不过实现方式不同,对于适配器模式用法还是有改变的

接口适配器

原理:通过抽象类来实现适配,这种适配稍别于上面所述的适配

现在不只是需要翻译成英语,需要翻译成日语、法语或西班牙语或者需要这几种语言任意组合

创建接口

public interface SpeakMany {    void speakJpanese();    void speakSpanish();    void speakEnglish();    void speakFrances();}

中间适配器

public abstract class SpeakWrapper implements SpeakMany{    protected SpeakChinese speakChinese;    public SpeakWrapper(SpeakChinese speakChinese) {        this.speakChinese = speakChinese;    }    @Override    public void speakJpanese() {        speakChinese.speakChinese();    }    @Override    public void speakSpanish() {        speakChinese.speakChinese();    }    @Override    public void speakEnglish() {        speakChinese.speakChinese();    }    @Override    public void speakFrances() {        speakChinese.speakChinese();    }}

双语

public class SpeakSpanishAndEnglish extends SpeakWrapper {    public SpeakSpanishAndEnglish(SpeakChinese speakChinese) {        super(speakChinese);    }    @Override    public void speakEnglish() {        super.speakEnglish();        System.out.println("speak English");    }    @Override    public void speakFrances() {        super.speakFrances();        System.out.println("speak France");    }}

测试

@Test    public void wrapperTest(){        SpeakMany speakMany = new SpeakSpanishAndEnglish(new SpeakChinese());        speakMany.speakEnglish();        speakMany.speakFrances();    }

转载于:https://www.cnblogs.com/sound-of-dream/p/9766859.html

你可能感兴趣的文章