设计模式-适配器模式

适配器模式

让一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

主要解决:当需要使用一个现有类而其接口并不符合你的需要时
所属类型:结构型模式
如何解决:依赖或继承
关键代码:适配器继承或依赖已有的对象,实现想要的目标接口。
优点:1、可以让两个没有关联的类一起运行;2、提高了类的复用;3、增加了类的透明度;4、灵活性好
缺点:过多使用适配器则会非常零乱。

接下来进行一个样例的实现,目的是进行格式的转换,就相当于是格式工厂的工作。
首先是创建一个FormerFactory用于充当格式工厂的角色,需要传入的参数是原来文件的名称和目标的格式。

public interface FormerFactory {
    void changeToForm(String oldForm, String targetForm);
}

接着定义要转换的类型,这里简单列举mp3和mp4格式的实现。

public interface Forms {
    void mp3(String target);

    void mp4(String target);
}

紧接着对其进行实现,当转换为mp3格式时,仅需要在对应的mp3方法中进行实现,无需关注其他方法的实现,Mp4Form类同理。

public class Mp3Form implements Forms {

    @Override
    public void mp3(String target) {
        System.out.println("Change to mp3 form successfully. New file's name is : " + target + ".mp3");
    }

    @Override
    public void mp4(String target) {

    }
}

public class Mp4Form implements Forms{

    @Override
    public void mp3(String target) {

    }

    @Override
    public void mp4(String target) {
        System.out.println("Change to mp4 form successfully. New file's name is : " + target + ".mp4");
    }
}

这里就对对应的格式进行选择,相当于时一个真正意义上的格式工厂。为了让对应格式进行适配。

public class ChooseForm implements FormerFactory {


    Forms forms;

    public ChooseForm(String form) {
        if (form.contains("mp3")) {
            forms = new Mp3Form();
        } else if (form.contains("mp4")) {
            forms = new Mp4Form();
        }
    }

    @Override
    public void changeToForm(String oldForm, String targetForm) {
        if (oldForm.contains("mp4") && targetForm.contains("mp3")) {
            forms.mp3(oldForm.replace(".mp4", ""));
        } else if (oldForm.contains("mp3") && targetForm.contains("mp4")) {
            forms.mp4(oldForm.replace(".mp3", ""));
        }
    }
}

Command类作为格式转换的入口,在这里将要转换的数据进行输入,并且输入要转换成的数据格式。

public class Command {
    public static void main(String[] args) {
        ChooseForm chooseForm = new ChooseForm("mp4");
        chooseForm.changeToForm("Company.mp3", "mp4");
        chooseForm = new ChooseForm("mp3");
        chooseForm.changeToForm("Company.mp4", "mp3");
    }
}

Tips

简单总结一下,适配器模式做的事情就是适配器干的事情,为了适应一定的条件,就要进行对应的操作,让其适应对应的工作。适配器将一个对象包装起来以改变其接口,装饰者将一个对象包装起来以增加新的行为和责任,外观将一群对象包装起来以简化其接口。

posted @   忠肝义胆-多隆  阅读(14)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示