设计模式——适配器模式(type-c转3.5mm耳机口)

栏目: 后端 · 发布时间: 5年前

内容简介:本文简述适配器模式,考虑到java中没有多继承就只写了对象适配器模式,然后例子是怎么用转接口把3.5mm耳机插在小米8上面。适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配器使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。

本文简述适配器模式,考虑到 java 中没有多继承就只写了对象适配器模式,然后例子是怎么用转接口把3.5mm耳机插在小米8上面。

设计模式——适配器模式(type-c转3.5mm耳机口)

一、概念

适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配器使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。

适配器模式允许一个已存在的类的接口被用作另一个接口。通常可以在不需要修改源代码的情况下使用已存在的类。

其实在生活中,适配器随处看见,例如下图,一个type-c转耳机口的适配器。接下来让我看看适配器模式的结构,并用java代码来实现一个type-c接口的手机与3.5mm的耳机通过适配器连接。

设计模式——适配器模式(type-c转3.5mm耳机口)

适配器模式主要解决两个问题:

1.转换当前接口为客户端需要的接口

2.通过适配器使用没有我们需要的接口的类

描述看似相同,实际上出发点不同~嘿嘿,意会意会

二、结构

适配器模式有两种,一种是 类适配器 ,不过需要支持多继承的语言才能实现,本文主要讲解单继承也可以实现的 对象适配器 。下图是对象适配器模式的类图,Client需要一个实现Target接口的类来完成工作,而当前我们提供的只有Adaptee类,这时该怎么办呢?恩,我们就造一个适配器(adapter)来完成这个需求。

设计模式——适配器模式(type-c转3.5mm耳机口)

涉及到的主要角色:

Target :目标接口,也就是我们期待得到的接口。

Adaptee :当前拥有的接口,需要适配,已满足客户端的要求。

Adapter :适配器类,适配器模式的核心,就是将Adaptee转换成需要的接口的具体类。

三、Type-C转3.5mm耳机孔适配器

这个是小米8手机类,只提供插TypeC耳机的接口

public class Mi8{
    private TypeCEraPhones eraPhones;
	//打电话功能
    public void call() {
        System.out.println("打电话");
    }
	//播放音乐,有耳机就用耳机,没耳机就外放
    public void playMusic() {
        if (eraPhones != null){
            eraPhones.play();
        }else{
            System.out.println("外放");
        }

    }
	// 插个TypeC接口的耳机
    public void setEraPhones(TypeCEraPhones eraPhones) {
        this.eraPhones = eraPhones;
    }
}

这个是TypeC接口的耳机接口,听说用这个接口的耳机都好好贵呢~~

public interface TypeCEraPhones {
    void play();
}

这个是我们以前剩下的能听个响的3.5mm接口的耳机

public class Mi35MMEraPhones {
    public void play(){
        System.out.println("使用3.5mm孔的小米耳机播放声音");
    }
}

怎么办呢,是花大钱买个新的耳机(想想,如果真是个复杂的对象,重新实现功能是不是很头大),还是对当前这个3.5mm的耳机爆改,可是我还有个需要使用3.5mm的mp3 ,樂,这可怎么是好……于是机智的我去淘宝发现了一个type-c转3.5mm的接口,才5块钱!!藍

适配器类

public class Adapter implements TypeCEraPhones {
    private Mi35MMEraPhones eraPhones;

    public Adapter(Mi35MMEraPhones eraPhones) {
        this.eraPhones = eraPhones;
    }

    @Override
    public void play() {
        eraPhones.play();
    }
}

适配器实现了TypeC耳机的接口,并能把原来的耳机传进来,于是我们就能愉快的用原来的耳机在小米8上听音乐了,hooooooo~而且还能我的mp3使用,美滋滋~

四、缺省适配器模式

在很多情况下,必须让一个具体类实现某一个接口,但是这个类又用不到接口所规定的所有的方法。通常的处理方法是,把方法都实现了,有用的写上需要的方法,没用的提供空实现,烦死了

这些空的方法是一种浪费,有时也是一种混乱。只有看过这些空方法的代码,程序员才能知道哪些是空的,哪些不是空的,于是我们可以提供一个适配器类,来为接口所有方法提供空实现,然后这个具体类继承适配器接口,需要哪些方法,进行重写就可以。

在jdk中有AbstractList这样一个抽象类,实现了List接口,如果我们需要定制自己的集合类,就可以继承这个抽象类,需要哪些方法就可以对这些方法进行重写,而不用对List接口下所有方法都提供空实现。

缺省适配器模式是一种特殊的适配器模式,目的是在不得不继承某个方法时可以减少重写不需要的方法。

五、优缺点

优点

  • 更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。

  • 更好的扩展性:在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。

缺点

  • 过多的使用适配器模式,会让系统难以把控,毕竟表面上是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。

六、总结

本文对适配器模式进行了简要介绍,主要把握是适配器实现需要的接口,并与adaptee进行组合,就可以实现对象适配器。在学习适配器模式过程中可以与装饰者模式和外观模式,适配器和装饰者使用方法类似,但是目的完全不同,前者是将一个接口转为另一个接,后者是为了对类进行增强;外观模式目的是对外提供一个简单的接口。

本文首发于cdream个人博客

欢迎转载,转载请注明出处!


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

代码

代码

劳伦斯・莱斯格 / 李旭 / 中信出版社 / 2004-10-1 / 30.00元

劳伦斯·莱斯格的著作《代码》 问世便震动了学界和业界,被人称为“也许是迄今为止互联网领域最重要的书籍”,也被一些学者称为“网络空间法律的圣经”。 《代码》挑战了早期人们对互联网的认识,即技术已经创造了一个自由的环境,因而网络空间无法被规制——也就是说,网络的特性使它押脱了政府的控制。莱斯格提出,事实恰恰相反。 代码的存在证明,网络并不是本制拷贝 ,不可规制的,它并没有什......一起来看看 《代码》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具