转载:http://www.importnew.com/23477.html   (推荐此链接,讲的比较通俗易懂),也可以参考博客:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html

我们周围的适配器

如果你需要在欧洲国家使用美国制造的笔记本电脑,你可能需要使用一个交流电的适配器。
你知道适配器的作用:它位于美式插头和欧式插座的中间,它的工作是将欧式插座转换成美式插座,好让美式插头可以插进这个插座得到电力。或者也可以这么认为:适配器改变了插座的接口,以符合美式笔记本电脑的需求。
好了,这是真实世界的适配器,那面向对象适配器又是什么呢?其实,OO适配器和真实世界的适配器扮演着同样的角色:将一个接口转换成另一个接口,以符合客户的期望。

面向对象适配器

假设已有一个软件系统,你希望它能和一个新的产商类库搭配使用,但是这个新产商所设计出来的接口,不同于旧产商的接口:

你不想改变现有的代码,解决这个问题(而且你也不能改变产商的代码)。所以该怎么做?你可以写一个类,将新产商接口转换成你所期望的接口。


这个适配器工作起来就如同一个中间人,它将客户所发出的请求转换成产商类能理解的请求。这个适配器实现了你的类所期望的接口,而且这个适配器也能和产商的接口沟通。

火鸡转换器

我们先来看看一个简化的鸭子和火鸡的接口和类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 鸭子基类
publicinterface Duck {
    publicvoid quack();
    publicvoid fly();
}
// 绿头鸭是鸭子的子类,实现了鸭子的呱呱叫和飞行的能力
publicclass MallardDuck implementsDuck{
    @Override
    publicvoid quack() {
        System.out.println("Quack");
    }
    @Override
    publicvoid fly() {
        System.out.println("I'm flying");
    }
}
// 火鸡基类
publicinterface Turkey {
    // 火鸡不会呱呱叫,只会咯咯叫
    publicvoid gobble();
    // 火鸡会飞,虽然飞不远
    publicvoid fly();
}
// 野生火鸡
publicclass WildTurkey implementsTurkey{
    @Override
    publicvoid gobble() {
        System.out.println("Gobble gobble");
    }
    @Override
    publicvoid fly() {
        System.out.println("I'm flying a short distance");
    }
}

现在,假设你缺鸭子对象,想用一些火鸡对象来冒充。显而易见,因为火鸡的接口不同,所以我们不能公然拿来用。那么,写个适配器吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 首先,你需要实现想转换成的类型接口,也就是你的客户期望看到的接口
publicclass TurkeyAdapter implementsDuck {
    Turkey turkey;
    // 接着,需要取得要适配的对象引用,这里我们引用构造器取得这个引用
    publicTurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }
    // 现在我们需要实现接口中所有的方法。quack()在类之间的转换很简单,
    // 只要调用gobble()接可以了
    @Override
    publicvoid quack() {
        turkey.gobble();
    }
    // 固然两个接口都具备了fly()方法,火鸡的飞行距离很短,不像鸭子可以长途飞行。
    // 要让鸭子的飞行和火鸡的飞行能够对应,必须连续五次调用火鸡的fly()来完成
    @Override
    publicvoid fly() {
        for(inti = 0; i < 5; i++) {
            turkey.fly();
        }
    }
}

适配器模式解析

客户使用适配器的过程如下:
1. 客户通过目标接口调用适配器的方法对适配器发出请求;
2. 适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口;
3. 客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。

请注意,客户和被适配者是解耦的,一个不知道另一个。

现在,我们知道,这个模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。这可以让客户从实现的接口解耦。如果在一段时间之后,我们想要改变接口,适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口而每次跟着修改。

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

也请留意,这个模式是如何把客户和接口绑定起来,而不是和实现绑定起来的。我们可以使用数个适配器,每一个都负责转换不同组的后台类。或者,也可以加上新的实现,只要它们遵守目标接口就可以。

设计模式之适配器模式--java描述相关推荐

  1. 软件设计模式之适配器模式(JAVA)

    什么是适配器模式? 在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的.适配器能将因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存 ...

  2. java什么是适配器类?作用是什么?_软件设计模式之适配器模式(JAVA)

    什么是适配器模式? 在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的.适配器能将因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存 ...

  3. Java设计模式之适配器模式(属于结构型模式)

    Java设计模式之适配器模式(结构型模式) 定义:将一个类的接口转换成客户希望的另外一个接口.Adaptor模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 模式中的角色: 目标接口(T ...

  4. Java面试题:单例设计模式、适配器模式的不同方式

    QUESTION:单例设计模式.适配器模式的不同方式? ANSWER: 1.单例设计模式,适配器设计模式     单利设计模式:             在java中,单例模式是指为了保证类在内存中只 ...

  5. Java描述设计模式(05):原型模式

    一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...

  6. Java进阶专题(八) 设计模式之适配器模式、装饰者模式、观察者模式

    本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式.本章节参考资料书籍<Spring ...

  7. 设计模式回顾——适配器模式(C++)

    文章目录 1 前言 2 什么是适配器模式 2.1 生活中的适配器 2.2 适配器模式含义 2.3 适配器模式作用 3 适配器模式优缺点 3.1 适配器优缺点 3.2 类适配器优缺点 3.3 对象适配器 ...

  8. 设计模式适配器模式_21世纪的设计模式:适配器模式

    设计模式适配器模式 这是我的演讲的第三部分," 21世纪的设计模式" . 适配器模式桥接世界. 在一个世界中,我们有一个概念的界面. 在另一个世界,我们有不同的界面. 这两个接口有 ...

  9. java设计模式有哪些(java设计模式刘伟课后答案)

    Java设计模式之Flyweight模式是怎样的? Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对 ...

最新文章

  1. 一分钟让你快速了解红外气体传感器作用,特性及应用
  2. localhost与127.0.0.1的概念和工作原理之不同
  3. JavaScript -- Window-Interval
  4. 【QM-04】Inspection Characteristic(检验特征)
  5. python opencv imread()函数 (从文件加载图像)
  6. linux给文件赋权限找不到,linux 文件赋权限
  7. python中异常和错误是一个概念_Python的异常概念介绍以及处理
  8. 【Python爬虫学习实践】基于BeautifulSoup的网站解析及数据可视化
  9. 将字符串中的大写字母变成小写字母
  10. GIS实战应用案例100篇(三)-基于NDVI指数的绿地信息提取
  11. np.unique( )--去除数组中的重复数字,并进行排序之后输出
  12. LINUX weblogic集群搭建- 03启动脚本的控制
  13. Python排序算法---快速排序
  14. Hyper-V Windows 8.1 Windows Server 2012 R2 QA
  15. 全息过山车:巨蚁数字全息刺激体验
  16. 路由器克隆电脑mac地址,破解电脑连接固定网线ip
  17. 报表开发工程师面试准备
  18. C语言 | 复制字符串 不用strcpy
  19. 03Roberts算子
  20. 女子监狱第四季/全集Orange Is the New Black迅雷下载

热门文章

  1. hdu 1086 线段相交
  2. 【最详细解析+难点分析】1085 PAT单位排行 (25分)
  3. 【详细解析】1080 MOOC期终成绩 (25分)_45行代码AC
  4. Online DDL
  5. PHP 运动会,运动会成绩管理系统
  6. 子网划分以及子网掩码
  7. Exchange Server 2013 一步步安装图解
  8. javaI/O之PushbackInputStream
  9. java并发编程--一道经典多线程题的2种解法
  10. 三星手机续航测试软件,三星S21系列续航测试简报出炉