文档章节

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

TedYin
 TedYin
发布于 2014/04/19 22:00
字数 879
阅读 510
收藏 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?
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
11/06
0
0
编程中的那些套路——关于策略模式

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

gzchen
08/27
0
0
编程中的那些套路——关于适配器模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天我们来谈谈适配器模式。 想象一个场景: 有一个类方法它部署在服务器上,专门负责大多数语言都通用的...

gzchen
08/27
0
0
Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei
05/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Alibaba Sentinel 整合 Feign 的设计实现

作者 | Spring Cloud Alibaba 高级开发工程师洛夜 来自公众号阿里巴巴中间件投稿 前段时间 Hystrix 宣布不再维护之后(Hystrix 停止开发。。。Spring Cloud 何去何从?),Feign 作为一个跟 ...

Java技术栈
8分钟前
3
0
虚拟机加密

在超融合的基础设施和虚拟化成为常态的世界里,对加密的要求越来越高,越来越迫切,IT部门需考虑的重大安全问题和方法也浮现了出来。 物理数据中心时代,采取双保险式数据安全方法是相对简单...

linuxCool
11分钟前
0
0
MySQL 主从同步

MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的 MySQL主从是基于binlog的,主上须开启bin...

野雪球
24分钟前
0
0
OSChina 周一乱弹 —— 温柔的人应该这样

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @clouddyy :#每日一歌# 《フィクション-sumika》 《フィクション-sumika》 手机党少年们想听歌,请使劲儿戳(这里) 假期时间干嘛去, @for...

小小编辑
今天
202
7
[LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

描述 设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。 如何反序列化或序列化二叉树是没有限制的,你...

honeymose
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部