文档章节

设计模式之——适配器模式详解

TedYin
 TedYin
发布于 2014/04/19 22:00
字数 879
阅读 509
收藏 51

这次跟大家分享一下我对适配器模式的理解。

适配器模式的定义:

将一个类的接口转换成用户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类,可以一起工作了。

举个我们日常生活中的例子: 

有一部移动电源,有一部iphone一部android手机,需要充电使用普通的Usb线就可以给android手机充电,而在给iphone充电的时候必须使用适配iphone的万能转接头才能充电。

iphone和android就相当于两个不兼容的接口,转接头就相当于一个适配器,他使得iphone和android手机都能充电了。

在我们的项目中可以这样是用适配器模式:

加入我们开发一个发说说动态的功能,第一版要求可以发送文字,实现如下:

public interface ISendTextPost{
    public void sendTextPost();
}

public class SendTextPost implements ISendTextPost{
    public void sendTextPost{
        //发送文字动态
    }
}

实现方式如上所述,很简单。如果第二版要求既可以发图片也可以发文字动态,实现如下:

public interface ISendPicturePost{
    public void sendTextPost();
    pubiic void sendPicturePost();
}

    //假如发文字和图片是这样的~~
public class SendPicturePost implements ISendPicturePost{

    public void sendTextPost{
        //发送文字动态
    }

    public void sendPicturePost{
        //发送图片动态
    }
}

上述方法实现是否有问题?肯定是不行的,因为发送文字的方法之前已经实现了,完全没必要再去实现一次。如果重复的方法有很多呢,这样肯定不行了。

对于这种接口不兼容的问题,使用适配器模式可以很好的解决:

适配器模式的模型如下:

/*
* 用户所需功能接口 target1
*/
public interface ITarget1{
    public void doTarget1();
}

//target1实现类
public class Target1Impl implements ITarget1{
    public void doTarget1(){
        //做A事情
    }
}

/*
* 用户所需功能接口 target2
*/
public interface ITarget2{
    public void doTarget2();
}

//target2实现类
public class Target2Imp implements ITarget2{
    public void doTarget2(){
        //做B事情
    }
}

/*
* 适配器
*/
public class Adapter implements ITarget1, ITarget2{
    private ITarget1 target1;
    private ITarget2 target2;
    
    public Adapter(ITarget1 target1,ITarget2 target2){
        this.target1 = target1;
        this.target2 = target2;
    }
    
    public void target1(){
        //做A事情
        target1.doTarget1();
    }
    
    public void doTarget2(){
        //做B事情
        target2.doTarget2();
    }
}

//Client 
public class Client {
    public static void main(Sting[] args){
        ITarget1 target1 = new Target1Impl();
        ITarget2 target2 = new Target1Imp2();
        
        Adapter adapter = new Adapter(target1,target2);
        adapter.doTarget1();
        adapter.doTarget2();
    }
}

上面就是使用适配器的实现方式。在上述的实现方式中,target1和target2都是业务层面的接口,他们有不同的业务功能,对于客户端来说,调用target1接口时很正常,但是要兼容target2的功能的时候,就需要有一个类实现target1 的功能,并且兼容了target2功能的类,Adapter就是这样的一个类,他就是一个转换器,兼容不同的接口来实现功能。

     在上面的实现中,实质上是使用对象组合来实现业务功能的兼容。使用适配器可以使已有功能复用,加快开发效率,减少维护成本,在Adapter中也可以加入一些自己实现的公用方法,这样可以使得Adapter的功能更强大。在一个系统中不应该过多的使用Adapter类,如果不是很有必要则不需要使用,使用过多,会使得系统变得凌乱,不好把握,明明调的是A接口但是返回的是B结果。 

    适配器模式的最重要的一点就是,对象组合,转换匹配,复用功能。







© 著作权归作者所有

共有 人打赏支持
TedYin
粉丝 1
博文 20
码字总数 10592
作品 0
深圳
程序员
加载中

评论(1)

l
linsea
总结得很好,可否上个uml?
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
08/27
0
0
编程中的那些套路——关于工厂模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 前面我们写了简单工厂模式,《编程中的那些套路——关于简单工厂模式》,但简单工厂模式有一些不足(违反...

gzchen
08/27
0
0
编程中的那些套路——关于单例模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 在设计模式中,单例模式和工厂模式)可以说是使用的最普遍的设计模式了,所以掌握此种模式尤为重要。 单...

gzchen
08/27
0
0
编程中的那些经典套路——设计模式汇总

在正式阅读前,我先谈谈我们该用什么姿势和心态学习设计模式: 如果你还没有过多的编程经验(泛指半年以下),我建议你把它当做小说来看,能看懂多少是多少,因为半年以下经验的程序员用到设...

gzchen
08/27
0
0
C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子
2017/11/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
2
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
8
3
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
4
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
2
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部