什么是适配器模式?

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

实现适配器的方式?

①对象适配器模式
-- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。
②类适配器模式
-- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。
理论性的东西看起来就是比较烦,下面来举个日常的小例子来更好的了解适配器吧
图1:三相插头                 图2:二孔插座            图3:三相插头转二相的转换器
            
看完上面三幅图,我想大家应该都一目了然了,想把三相插头插到二孔插座里,只能中间加个转换器,这里我们可以简单把它理解成我们今天要说的适配器
再回过头看看文章开始的这句话"适配器能将因为接口不兼容而不能在一起工作的类工作在一起",没错,在两个原本不能工作到一起的组件中间添加适配器,就可以把它们关联起来了。
适配器模式里面存在着3种角色:
1、目标角色(Target):也就是客户理想中想要的接口,比如三相插头,客户想找的插孔就是三孔插座(目标角色)。
2、源(Adatee):现有的接口,也就是不满足客户想要的接口,也就是这个二孔插座(源)。
3、适配器(Adapter):能将二孔插座转换成"三孔插座"的组件,也就是上图的三相插头转二相插头转化器(适配器)。
就以上面的例子,用代码来讲下适配器模式吧
首先先来说下对象适配器模式
以笔记本通电为例,大家都知道正常的笔记本电源是三相接口
ThreeSocket.java
这是一个需求接口,也就是客户期待的,也就是3种角色中的目标接口(Target)
1 package com.lcw.adapter.test;
2
3 public interface ThreeSocket {
4
5     //需要一个三孔插座,也就是客戶的需求
6     public void needThreeSocket();
7
8 }

TwoSocket.java

这是现有的组件,也就是那个二孔插座,也就是3种角色中的源(Adatee),虽然能通电,但接口是不满足客户的需要

1 package com.lcw.adapter.test;
2
3 public class TwoSocket {
4     // 现有的插座,只有二孔,已经有了供电功能,只是缺少了三孔接口
5     public void serverTwo() {
6         System.out.println("我是一个二孔插座,我有供电功能");
7     }
8
9 }

ThreeToTwoAdapter.java

这是适配器类,它需要2孔插座来提供电,并实现三孔插座,在构造方法中传入现有组件2孔插座的对象(带电)

 1 package com.lcw.adapter.test;
 2
 3 public class ThreeToTwoAdapter implements ThreeSocket{
 4     private TwoSocket socket;
 5     public ThreeToTwoAdapter(TwoSocket two) {
 6         this.socket=two;
 7     }
 8     //现在已经有2孔插座的对象(意味着有通电功能)
 9     @Override
10     public void needThreeSocket() {
11         socket.serverTwo();
12         System.out.println("二孔接口已转换成三孔接口,并注入电");
13     }
14
15 }

这样一来,适配器类这个中间类就有了源(二孔插座)的效果也就是"电"

然后再实现了目标接口方法,也就是开通了三相接口,把"电"注入,这样就可以把2个本无法一起工作的类聚集到一起,类似红娘在它们之间牵了一条关系线

Computer.java 笔记本类,它需要的是三孔接口

 1 package com.lcw.adapter.test;
 2
 3 public class Computer {
 4     //笔记本电脑的电源插头需求是3孔
 5     private ThreeSocket three;
 6     public Computer(ThreeSocket three){
 7         this.three=three;
 8     }
 9     public void server(){
10         System.out.println("笔记本通电成功!");
11     }
12
13 }

来写个测试类

 1 package com.lcw.adapter.test;
 2
 3 public class Test {
 4     public static void main(String[] args) {
 5         //现有插座两孔,已经有提供电的功能,只是缺少3孔接口
 6         TwoSocket two=new TwoSocket();
 7         //把具有通电功能的对象传递进去,目的是要开通3孔接口的通电功能
 8         ThreeSocket three=new ThreeToTwoAdapter(two);
 9         //得到一个满足笔记本电源接口且具有电的功能对象
10         Computer computer=new Computer(three);
11         three.needThreeSocket();
12         computer.server();
13     }
14 }

看下效果图:

好了,这样就把2个原本不能在一起工作的类链接到一起了。

接着来说下类适配器模式

类适配器顾名思义不同点在于适配器,既然突出了'类",我们一般都会联想到继承

嗯,没错,类适配器的做法就是让适配器去继承已有功能(二孔插座)的类,然后再实现期望接口(三孔插座)

具体看代码吧,除了测试类和适配器类,其他的类与上面的保持一致,这里就不再贴出

ThreeToTwoExtendsAdapter.java(适配器类)

1 package com.lcw.adapter.test;
2
3 public class ThreeToTwoExtendsAdapter extends TwoSocket implements ThreeSocket{
4     public void needThreeSocket() {
5         this.serverTwo();
6         System.out.println("二孔接口已转换成三孔接口");
7     }
8
9 }

Test.java(测试类)

 1 package com.lcw.adapter.test;
 2
 3 public class Test {
 4     public static void main(String[] args) {
 5         //由于ThreeToTwoExtendsAdapter继承了源,所以具有源的功能(电),并实现了3孔接口
 6         ThreeSocket socket=new ThreeToTwoExtendsAdapter();
 7         //插入接口
 8         Computer computer=new Computer(socket);
 9         socket.needThreeSocket();
10         computer.server();
11
12     }
13 }

效果依旧:

总结下:

①对象适配模式:

把"被适配者"作为一个对象组合到适配器中,以修改目标接口包装被适配者。

(例如上面例子,二孔插座就是被适配者,把对象传入适配器并实现接口方法改造)

②类适配模式:

通过多重继承和实现接口的方式,单一的为某个类而实现适配。

适配器的作用?

1、透明:通过适配器客户端可以调用统一接口,对于客户端是透明的,这样做可以更加简洁, 直接,紧凑。

2、复用:复用了现存的类,解决因环境要求不一致的问题。

3、低耦合:将目标类与源类解耦,引入一个适配器重用源类(适配器类),遵守开放-关闭原则。

作者:Balla_兔子
出处:http://www.cnblogs.com/lichenwei/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

软件设计模式之适配器模式(JAVA)相关推荐

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

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

  2. 设计模式之适配器模式--java描述

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

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

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

  4. 软件设计模式〔Java版〕习题

    第1章 软件设计模式础 1.1 软件设计模式概述 1.2 UML中的类图 1.3 面向对象的设计原则 名词解释 一个软件实体应当对扩展开放,对修改关闭,即在不修改源代码的基础上扩展一个系统的行为. 一 ...

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

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

  6. 【Spring】JavaBean、MVC软件设计模式与Java中Dao、Service、Controll三层体系

    文章目录 一.JavaBean 二.Java三层体系 1.Dao层 2.Service层 3.Controller层 三者之间的关系 三.MVC设计模式 1.模型 2.视图 3.控制器 三者之间的关系 ...

  7. 软件设计模式的学习(以Java为例)

    软件设计模式的学习(以Java为例) 单例模型 定义: 懒汉模式 饿汉模式 单例模式的优缺点 优点 缺点 工厂模式 定义 分类 工厂方法模式 抽象工厂模式 代码实现 优点 缺点 文章引用 软件设计模式 ...

  8. java 分时图_软件设计模式(观察者模式)——模拟股票价格变动并绘制分时图和K线图...

    一.观察者模式简介: 首先看百度百科上对观察者模式的简介:观察者模式(Observer)完美的将观察者和被观察的对象分离开.举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数 ...

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

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

最新文章

  1. Python maketrans() 方法
  2. 2018专业创业赛事服务平台
  3. Matlab编程序设计数字滤波器
  4. 通过计算机二级考试的计划,如何轻松通过国家计算机二级考试
  5. 超级强大的心理定律~~!你可以变成你想要的样子!~
  6. egg 编码规范_Egg 框架简述 (仅学习)
  7. 怎么给图片降噪?WidsMob Denoise 图片降噪教程
  8. mysql里的各种锁
  9. tkinter 中给某个文本加上滚动条_Python Tkinter自制文本编辑器
  10. 树莓派4支持多大tf卡_树莓派raspberry4B入坑指南 part-0
  11. python列表比大小_Python列表按组大小排序
  12. 微信小程序源代码基本文件类型
  13. 366万常用的中 txt 网盘_人间值得 – 中村恒子 pdf+azw3+epub+mobi+txt+docx|百度网盘资源分享...
  14. 华为路由器显示连接到服务器失败怎么办,华为路由器设置好了不能用怎么办 华为路由器无法上网问题-192路由网...
  15. 程序员的工资是不是太高了?真相让人心疼
  16. python-静态网页爬取
  17. 很多事情看似很完美,一不小心就成了杯具~
  18. 做你喜欢做的事,财富会随之而来
  19. Highcharts实现走势图
  20. 如何在本地搭建一个EasyPlayer的H5 demo 播放H265视频流?

热门文章

  1. mysql主从1594错误_3分钟解决MySQL主从1594错误
  2. 6.824 RPC lesson2 2020(二)
  3. 春招我借这份PDF的复习思路,论程序员成长的正确姿势
  4. 连续四年百度Android岗必问面试题!Android校招面试指南
  5. 离开小厂进大厂的第一周,BTAJ大厂最新面试题汇集,面试总结
  6. Jenkins 中定时任务构建
  7. Spring主要用到两种设计模式
  8. 1G.小a的排列(C++)
  9. 微信小程序页面跳转、逻辑层模块化
  10. Dapper基础知识三