什么是适配器模式?

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

实现适配器的方式?

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

 public interface ThreeSocket {

     //需要一个三孔插座,也就是客戶的需求
public void needThreeSocket(); }

TwoSocket.java

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

 package com.lcw.adapter.test;

 public class TwoSocket {
// 现有的插座,只有二孔,已经有了供电功能,只是缺少了三孔接口
public void serverTwo() {
System.out.println("我是一个二孔插座,我有供电功能");
} }

ThreeToTwoAdapter.java

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

 package com.lcw.adapter.test;

 public class ThreeToTwoAdapter implements ThreeSocket{
private TwoSocket socket;
public ThreeToTwoAdapter(TwoSocket two) {
this.socket=two;
}
//现在已经有2孔插座的对象(意味着有通电功能)
@Override
public void needThreeSocket() {
socket.serverTwo();
System.out.println("二孔接口已转换成三孔接口,并注入电");
} }

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

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

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

 package com.lcw.adapter.test;

 public class Computer {
//笔记本电脑的电源插头需求是3孔
private ThreeSocket three;
public Computer(ThreeSocket three){
this.three=three;
}
public void server(){
System.out.println("笔记本通电成功!");
} }

来写个测试类

 package com.lcw.adapter.test;

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

看下效果图:

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

接着来说下类适配器模式

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

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

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

ThreeToTwoExtendsAdapter.java(适配器类)

 package com.lcw.adapter.test;

 public class ThreeToTwoExtendsAdapter extends TwoSocket implements ThreeSocket{
public void needThreeSocket() {
this.serverTwo();
System.out.println("二孔接口已转换成三孔接口");
} }

Test.java(测试类)

 package com.lcw.adapter.test;

 public class Test {
public static void main(String[] args) {
//由于ThreeToTwoExtendsAdapter继承了源,所以具有源的功能(电),并实现了3孔接口
ThreeSocket socket=new ThreeToTwoExtendsAdapter();
//插入接口
Computer computer=new Computer(socket);
socket.needThreeSocket();
computer.server(); }
}

效果依旧:

总结下:

①对象适配模式:

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

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

②类适配模式:

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

适配器的作用?

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

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

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

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

软件设计模式之适配器模式(JAVA)的更多相关文章

  1. 软件设计模式之单例模式(JAVA)

    什么是单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系 ...

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

    前言 ​ 今天开始我们专题的第八课了.本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式. ...

  3. Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)

    1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实 ...

  4. JAVA学习笔记--策略设计模式与适配器模式

    一.策略设计模式 创建一个能够根据所传递对象的不同而具有不同行为的方法被称为策略设计模式:这类方法包含所要执行的算法中固定不变的部分,而“策略”包含变化的部分.策略就是传递进去的参数对象,它包含要执行 ...

  5. 常用的软件设计模式的Java实现——让编程从野生到飞起

    常用的软件设计模式的Java实现——让编程从野生到飞起_野生技术协会_科技_bilibili_哔哩哔哩  https://www.bilibili.com/video/av7596511/

  6. 设计模式之第15章-适配器模式(Java实现)

    设计模式之第15章-适配器模式(Java实现) “呔,来着何人,报上名来.”“这是谁啊,我怎么没见过”,“就是啊,我也没印象.”“我当然是适配器了,要不然还能是谁.”适配器模式碎碎念:我不就是昨天把你 ...

  7. java设计模式5——适配器模式

    java设计模式5--适配器模式 1.结构型模式介绍 1.1.作用 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式 代理模式 桥接模式 装饰模式 组合模式 ...

  8. 23种设计模式全解析 (java版本)

    转自:http://blog.csdn.net/longyulu/article/details/9159589 其中PHP常用的五种设计模式分别为:工厂模式,单例模式,观察者模式,策略模式,命令模式 ...

  9. [置顶] 我的设计模式学习笔记------>Java设计模式总概况

    设计模式的概念最早起源于建筑设计大师Alexander的<建筑的永恒方法>一书,尽管Alexander的著作是针对建筑领域的,但是他的观点实际上用用于所有的工程设计领域,其中也包括软件设计 ...

随机推荐

  1. JS实现多行文本最后是省略号紧随其后还有个超链接在同一行的需求

    1.布局及样式如下图: 2.js获得上图的div对象,然后判断div对象的高度,如果大于一行的高度了表示内容有两行了,再获得span标签里面的内容并用正则将后六个字符替换成“......”这里的实现代 ...

  2. java面向对象(1)

    一.方法传不固定值的用法 public void Test(int a,Person ...Persons)         {             for(Person p:Persons){ ...

  3. Charles做代理的Map Remote路径配置

    使用Webpack做前端开发时,本地localhost使用了Webpack-dev-server搭建一个服务,开发阶段如果想把对本地后台的请求改为对外网的请求,可以使用Charles开启代理,把路径修 ...

  4. 【Unity】角色受伤后的闪烁(blink/flash)效果

    玩家受伤后,一段时间内快速闪烁.这里想要的闪烁效果是玩家快速的显隐切换效果,而不是玩家变白的情况. 快速切换玩家的显隐效果不能用SetActive修改角色物体本身的激活状态,因为玩家角色身上的其他脚本 ...

  5. iOS应用跳转到App Store评分

    iOS应用跳转到App Store评分 1.跳转到应用评价页 NSString *urlStr = [NSString stringWithFormat:@"itms-apps://itun ...

  6. BFS-广度优先遍历

    #include <iostream> #include <queue> using namespace std; /* 5 4 0 0 1 0 0 0 0 0 0 0 1 0 ...

  7. 看见- 柴静-kindle书摘

    笔记本导出 看见 柴静 序 言 标注(黄色) - 位置 3 关心新闻中的人—— 标注(黄色) - 位置 36 二〇〇〇年,我还是湖南卫视“新青年”主持人, 第一章 / 别当了主持人就不是人了 标注(黄 ...

  8. Ubuntu下Eclipse中文乱码解决

    把Windows下的工程导入到了Linux下Eclipse中,由于以前的工程代码,都是GBK编码的(Windows下的Eclipse 默认会去读取系统的编码,所以Widnwos下的Eclipse的编码 ...

  9. web界面设计

    本书描述了6个设计原理,即直截了当.简化交互.足不出户.提供邀请.使用变换.即时反应. 一.直截了当(alan cooper:"在哪里输出,就要允许在哪里输入") 1.1 行内编辑 ...

  10. android SpannableString使用详解

    /** * 超链接 */ private void addUrlSpan() { SpannableString spanString = new SpannableString("超链接& ...