文档章节

Java设计模式 - 适配器模式

那只是一股逆流
 那只是一股逆流
发布于 2016/11/24 09:16
字数 836
阅读 27
收藏 1

概念:

  将一个类的接口,转换成客户期望的另一个接口。适配器模式让原来接口不兼容的类可以在一起工作。

 

解决的问题:

  提供类似于中间人的作用:把原本不兼容、不能一起工作的接口组合在一起,使得它们能够在一起正常的工作。

 

模式结构:

  有两种适配器模式:对象适配器和类适配器。

  因为类适配器需要使用到多重继承,而Java不支持多重继承,所以本文就只对对象适配器进行解释。

  

  模式中的角色:

  Target(目标接口):客户请求的接口。Adapter必须要实现这个接口(也可以是抽象类)。

  Adapter(适配器类):实现Target接口,组合用户所需要的类。

  Adaptee(被适配者):请求最终的执行者。

 

  UML图:

     

    这种适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者:这种做法还有额外的优点,那就是,被适配者的任何子类,都可以搭配着适配器使用。

 

 

情景导入:

  某个玩具厂商的用户需要一种能学鸭子叫的玩具鸡,怎么办?

  厂商想这还不容易:我只要生产一个玩具鸡的外形,将它的发音功能委托生产玩具鸭的生产线负责。也就是说:外表看上去是玩具鸡,但发音这个功能有玩具鸭实现。

  

package com.tony.Adapter;  

/**  
 * Target接口,接收用户请求。  
 * 玩具鸡  
 */  
public interface Chicken { 

  void speak(); 
}
package com.tony.Adapter;  

/**  
 * 玩具鸭接口  
 * 面向接口编程是一种好习惯  
 */  
public interface Duck {  

   void speak(); 
}
package com.tony.Adapter;  

/**  
 * Adapter  
 * 玩具鸡适配器,将发音请求委托给玩具鸭。  
 */  
public class ChickenAdapter implements Chicken { 
 
    private Duck duck; 
    public ChickenAdapter(){ 
        duck = new ToyDuck(); 
    } 
    @Override 
    public void speak() { 
        duck.speak(); 
    } 

}
package com.tony.Adapter;  

/**  
 * Adaptee  
 * 被适配者,请求的真正执行者。  
 */  
public class ToyDuck implements Duck{  

    @Override 
    public void speak() { 
        System.out.println("I'm duck, ga ga ga..."); 
    } 
}
package com.tony.Adapter; 

public class Test { 
    public static void main(String[] args) { 
        Chicken toyChicken = new ChickenAdapter(); 
        toyChicken.speak(); 
    } 
}

 

 

 

  客户使用适配器的过程:

  1、客户通过目标接口调用适配器的方法对适配器发出请求。

  2、适配器使用被适配者接口吧请求转换成适配者的一个或多个调用接口。

  3、客户接受到调用的结果,但并未察觉这一切是适配器在起转换作用。

 

  其实说了这么多都是为了说明一件事:适配器就是将客户的请求委托给其它能够完成该功能的类!只是起到了一个中转的作用!

 

模式总结:

  优点:

    提高代码重用率。使原本不能在实际情况下使用的类通过适配器又可以正常工作。

    当需求发生改变时,只需要改变被适配者,无需改动其它任何代码。这对客户端是透明的,使得代码更加简洁。

    被适配者的任何子类都可以搭配适配器使用。

 

  适用场景:

    当两个毫不相关的类需要在一起工作。

    需要使用别人的接口而又不想改动自己的代码。

    旧系统升级等等。

   

 

参考资料:

  《Head First 设计模式》

 

 

© 著作权归作者所有

共有 人打赏支持
那只是一股逆流
粉丝 9
博文 22
码字总数 26214
作品 0
南岸
后端工程师
私信 提问
从 Java 到 Scala (三): object 的应用

本文由 Captain 发表在 ScalaCool 团队博客。 在上篇 Java 到 Scala 系列中,我想你或多或少在语言特性上对有了一定的掌握,在了解完它酷酷的语言特性——让静态回归常态并能简单运用其衍生出...

ScalaCool
09/10
0
0
20个设计模式和软件设计面试问题

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎...

LCZ777
2014/08/13
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
10/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

node上的redis调用优化示例

Node.js读写数据到influxDB,目前已经有一个库node-influx, 这个库功能非常强大,但是我个人使用这个库的时候,遇到无法解决的问题。 使用curl都可以写数据到influxDB,但是用node-influx总是...

前端攻城老湿
11分钟前
1
0
The setting logImpl is not known

问题: org.apache.ibatis.builder.BuilderException: The setting logImpl is not known. Make sure you spelled it correctly (case sensitive). MyBatis 3.1.1 -jar还没有 logImpl 这个设......

晨猫
23分钟前
1
0
eslint一些规则

一、指定js文件不使用 ESLint 语法检查 1.整个文件范围内禁止规则出现警告 将/* eslint-disable */放置于文件最顶部 /* eslint-disable */alert('foo'); 2.在文件中临时禁止规则出现警告 ...

xiaoge2016
23分钟前
1
0
mac终端常用命令

ls ls,list的简写,列出目录的内容。 -a:显示隐藏文件 -l:以列表方式显示文件信息 -h:配合-l,显示更人性化 配合通配符使用 ls *.txt:显示所有以.txt结尾的文件 ls ?.txt:显示‘任意字符.tx...

xiaobai1315
24分钟前
1
0
java命令行读取配置,和加载jar的方式

--spring.profiles.active=t2,t3,xextest --spring.profiles.include=quartz-jp-Djava.ext.dirs=libs-Dspring.config.location=/data/apps/DBconfig -cp  "config/*"  start.sh......

经常把天聊死的胖子
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部