博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
软件设计模式之适配器模式(JAVA)
阅读量:4563 次
发布时间:2019-06-08

本文共 3815 字,大约阅读时间需要 12 分钟。

什么是适配器模式?

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

 

实现适配器的方式?

①对象适配器模式
-- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。
 
②类适配器模式
-- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。
 
 
理论性的东西看起来就是比较烦,下面来举个日常的小例子来更好的了解适配器吧
 
图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     @Override10     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、低耦合:将目标类与源类解耦,引入一个适配器重用源类(适配器类),遵守开放-关闭原则。

 

作者:

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

转载于:https://www.cnblogs.com/lichenwei/p/3948348.html

你可能感兴趣的文章
pgsql查询优化之模糊查询
查看>>
不变模式
查看>>
20181227 新的目标
查看>>
androidtab
查看>>
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>
让我们再聊聊浏览器资源加载优化
查看>>
underscore demo
查看>>
CSS hack
查看>>
每日一小练——数值自乘递归解
查看>>
qq登陆错误提示
查看>>
bzoj 1192: [HNOI2006]鬼谷子的钱袋 思维 + 二进制
查看>>
没写完,没调完,咕咕咕的代码
查看>>
Android Studio使用技巧:导出jar包
查看>>
Problem E. TeaTree - HDU - 6430 (树的启发式合并)
查看>>
Kafka序列化和反序列化与示例
查看>>
win10下VS2010中文输入法切换为英文卡死
查看>>
retinex相关代码汇总
查看>>
Cortex-M3 异常返回值EXC_RETURN
查看>>