适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。

01、类的适配器模式

核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口是Targetable,通过Adapter类,将Source的功能扩展到Targetable里,看代码:

  1. public class Source {
  2.  
  3. public void method1() {
  4. System.out.println("this is original method!");
  5. }
  6. }
  1. public interface Targetable {
  2.  
  3. /* 与原类中的方法相同 */
  4. public void method1();
  5.  
  6. /* 新类的方法 */
  7. public void method2();
  8. }
  1. public class Adapter extends Source implements Targetable {
  2.  
  3. @Override
  4. public void method2() {
  5. System.out.println("this is the targetable method!");
  6. }
  7. }

Adapter类继承Source类,实现Targetable接口,下面是测试类:

  1. public class AdapterTest {
  2.  
  3. public static void main(String[] args) {
  4. Targetable target = new Adapter();
  5. target.method1();
  6. target.method2();
  7. }
  8. }
 

输出:

this is original method!
this is the targetable method!

这样Targetable接口的实现类就具有了Source类的功能。

02、对象的适配器模式

基本思路和类的适配器模式相同,只是将Adapter类作修改,这次不继承Source类,而是持有Source类的实例,以达到解决兼容性的问题。看图:

只需要修改Adapter类的源码即可:

  1. public class Wrapper implements Targetable {
  2.  
  3. private Source source;
  4.  
  5. public Wrapper(Source source){
  6. super();
  7. this.source = source;
  8. }
  9. @Override
  10. public void method2() {
  11. System.out.println("this is the targetable method!");
  12. }
  13.  
  14. @Override
  15. public void method1() {
  16. source.method1();
  17. }
  18. }
 

测试类:

  1. public class AdapterTest {
  2.  
  3. public static void main(String[] args) {
  4. Source source = new Source();
  5. Targetable target = new Wrapper(source);
  6. target.method1();
  7. target.method2();
  8. }
  9. }
 

输出与第一种一样,只是适配的方法不同而已。

03、接口的适配器模式

第三种适配器模式是接口的适配器模式,接口的适配器是这样的:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。看一下类图:

这个很好理解,在实际开发中,我们也常会遇到这种接口中定义了太多的方法,以致于有时我们在一些实现类中并不是都需要。看代码:

  1. public interface Sourceable {
  2.  
  3. public void method1();
  4. public void method2();
  5. }

抽象类Wrapper2:

  1. public abstract class Wrapper2 implements Sourceable{
  2.  
  3. public void method1(){}
  4. public void method2(){}
  5. }
  1. public class SourceSub1 extends Wrapper2 {
  2. public void method1(){
  3. System.out.println("the sourceable interface's first Sub1!");
  4. }
  5. }
  1. public class SourceSub2 extends Wrapper2 {
  2. public void method2(){
  3. System.out.println("the sourceable interface's second Sub2!");
  4. }
  5. }
  1. public class WrapperTest {
  2.  
  3. public static void main(String[] args) {
  4. Sourceable source1 = new SourceSub1();
  5. Sourceable source2 = new SourceSub2();
  6.  
  7. source1.method1();
  8. source1.method2();
  9. source2.method1();
  10. source2.method2();
  11. }
  12. }

测试输出:

the sourceable interface's first Sub1!
the sourceable interface's second Sub2!

达到了我们的效果!

讲了这么多,总结一下三种适配器模式的应用场景:

类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。

接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。

转自:http://www.cnblogs.com/geek6/p/3951677.html

设计模式--适配器模式(Adapter)详解的更多相关文章

  1. Android进阶(十四)Android Adapter详解

    Android Adapter详解 Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View.因为layout五花八门,很多数据都不能直接绑定上去, ...

  2. Java设计模式之单例模式详解

    在Java开发过程中,很多场景下都会碰到或要用到单例模式,在设计模式里也是经常作为指导学习的热门模式之一,相信每位开发同事都用到过.我们总是沿着前辈的足迹去做设定好的思路,往往没去探究为何这么做,所以 ...

  3. 热门前沿知识相关面试问题-MVC/MVP/MVVM架构设计模式面试问题详解

    MVC[最常用]: MVC的定义:M:业务逻辑处理.[业务MODEL]V:处理数据显示的部分.[如xml布局文件]C:Activity处理用户交互的问题.[也就是Activity在MVC中扮演着C的角 ...

  4. 《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)

    1.简介 页面对象模型(Page Object Model)在Selenium Webdriver自动化测试中使用非常流行和受欢迎,作为自动化测试工程师应该至少听说过POM这个概念.本篇介绍POM的简 ...

  5. 设计模式 - 适配器模式(adapter pattern) 具体解释

    适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...

  6. 设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释

    适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter patter ...

  7. 设计模式--适配器模式Adapter(结构型)

    一.适配器模式 适配器模式的主要作用是在新接口和老接口之间进行适配.将一个类的接口转换成客户端期望的另外一个接口.其实适配器模式有点无赖之举,在前期设计的时候,我们就不应该考虑适配器模式,而应该通过重 ...

  8. 说说设计模式~适配器模式(Adapter)

    返回目录 之前和大家一起谈了工厂模式和单例模式,今天来看一下另一种非常常用的模式,它就是适配器模式,第一次看到这个模式是通过“张逸”老师的“设计之道”这篇文章,在这里表adapter讲的很透彻,今天把 ...

  9. [工作中的设计模式]适配器模式adapter

    一.模式解析 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 也就是说,如果已经写好了一个接口,但是又来了一种截然不同的接口,如 ...

  10. C#设计模式——适配器模式(Adapter Pattern)

    一.概述在软件开发中,常常会想要复用一个已经存在的组件,但该组件的接口却与我们的需要不相符,这时我们可以创建一个适配器,在需复用的组件的接口和我们需要的接口间进行转换,从而能够正常的使用需复用的组件. ...

随机推荐

  1. java的日期

    直接看例子: import java.text.DateFormatSymbols; import java.util.Calendar; import java.util.GregorianCale ...

  2. 执行npm install报错:npm ERR! code EINTEGRITY

    命令行执行npm install报错如下: D:\frontend\viewsdev>npm install npm ERR! code EINTEGRITY npm ERR! sha512-8 ...

  3. Cmake编译opencv下载不了ffmpeg时的解决办法

  4. 批处理实现mysql的备份

    脚本 @echo off echo. echo MySQL数据库备份 echo ***************************** echo. echo 今天是 %date% echo 时间是 ...

  5. Data_Structure01-绪论作业

    一.作业题目 仿照三元组或复数的抽象数据类型写出有理数抽象数据类型的描述 (有理数是其分子.分母均为整数且分母不为零的分数). 有理数基本运算: 构造有理数T,元素e1,e2分别被赋以分子.分母值 销 ...

  6. Android网络技术

    WebView使用方法: 1.设置布局,在activity_main.xml中添加<webView> <LinearLayout...... <webView android: ...

  7. bootstrap的折叠组件1

    官网的例子: http://v3.bootcss.com/javascript/#collapse <div class="panel-group" id="acc ...

  8. Tool:Visual Studio

    ylbtech-Tool:Visual Studio Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品.VS是一个基本完整的开发工具集,它包括了整个软件生命 ...

  9. git 怎么上传文件到github上

    1.安装git     sudo  apt-get install git 2.配置全局变量     git config --global user.name langhunm     git co ...

  10. 论 html与css的关系

    一.网页前端三剑客基础介绍 1-1 Html和CSS的关系学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的: 1. HTM ...