Java设计模式之适配器设计模式(项目升级案例)
今天是我学习到Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一遍),我在北京向各位问好。老规矩,首先和各位谈谈适配器模式到底是个什么样的设计思想,而且在实际开发中又是如何应用的。
那些官方的概念我就不在这儿粘贴了,请各位自己想想办法。所谓适配器模式,按我意思说吧,其实它的目的就想达到新老兼容,使把原本不能放在一块工作的类或对象能够让它们同时使用起来,举个例子:比如拿一个互联网产品它的升级换代过程来说吧,如果我们想升级一个产品后不仅能正常使用新开发接口的功能,而且还能保证原来接口的功能依然能正常调用,那么就必须考虑到兼容老接口的问题,这时我们设计的时候可以采用"适配器模式"就可以做到。再比如:有一位阿富汗女子在环游世界,假设她到中国爬长城顺便买了一个手机充电器,完事后接着打算去德国柏林找一个男朋友,可是到了德国她想给她的手机充电,但是问题来了,德国插座的插头只能是2个圆头插头,但是她买的充电器的插头是3个扁平得插头,所以无法使用,这时她不得不在网上订购一个电源转换头才能充电,到这儿我们就能正大光明的引出我们的"适配器设计模式"了,正因为有了它的出现,这些问题才得以解决,而且还让阿富汗女子正常充上电(哈哈哈,纯属虚构望各位不要嘲笑我,我只不过是想给自己找点乐趣能够如愿以偿地学完适配器模式罢了)。
好了,我也不多扯了,直接上码,因为设计模式这块不是说你敲敲代码就能学会的,必须自己悟,希望我的总结能帮助各位更快的切入进去,更好的掌握适配器设计模式,再声明一次,我文章中的案例都是本人虚构的,如有不妥,请勿谩骂。
【案例一】:
项目的更新升级,假设对项目中获取用户信息的功能进行了改造,原来是通过主键获取用户信息,但是升级之后是通过主键和用户账号也能获取到用户信息,但是能够保证新功能和老功能都正常调用,这里我们可以通过适配器模式来设计,达到该需求。
新开发的接口和原来的接口:
/**
* 旧接口
*/
interface OldService{
//根据主键获取用户信息
Map<String,Object> getUserInfo(String Id);
}
/**
* 旧接口实现类
*/
class OldServiceImpl implements OldService{
//根据主键获取用户信息
@Override
public Map<String,Object> getUserInfo(String Id) {
HashMap<String,Object> userInfo = new HashMap<>();
userInfo.put("id", Id);
return userInfo;
}
} /**
* 新接口
*/
interface NewService{
//根据主键和账号获取用户信息
Map<String,Object> getUserInfo(String Id,String account);
}
/**
* 新接口实现类
*/
class NewServiceImpl implements NewService{
@Override
public Map<String,Object> getUserInfo(String Id, String account) {
HashMap<String,Object> userInfo = new HashMap<>();
userInfo.put("id", Id);
userInfo.put("account", account);
return userInfo;
}
}
为了能够兼容新老接口同时使用,则通过适配器模式来设计一个适配器类,该适配器类需要实现新接口,因为项目已经开发了新接口,我们不可能再去使用旧接口的功能,其次在适配器类中声明一个老接口的实例,目的是能够兼容老接口中的方法。
/**
* 接口适配器,兼容新老接口的功能都能正常调用
*/
class InterfaceAdapter implements NewService{ //既然开发了新接口,就必须使用新接口的功能,实现新接口 //该适配器是针对为了能够兼容老接口正常使用,则在创建适配器对象时必须传入一个旧接口的实现类对象
private OldService oldService;
public InterfaceAdapter(OldService oldService) {
this.oldService = oldService;
} //经过适配器的兼容,就能通过适配器来正常调用旧接口的功能
@Override
public Map<String, Object> getUserInfo(String Id, String account) {
System.out.println("升级后兼容旧接口");
return oldService.getUserInfo(Id);
}
}
最后通过测试,不管是新接口还是老接口,还是你想调用新接口时达到老接口的功能都没问题,适配器模式都帮你解决了这些问题。
public class AdapterUpgrade {
public static void main(String[] args) {
//使用旧接口功能
OldService old = new OldServiceImpl();
Map<String, Object> oldMap = old.getUserInfo("7758520");
System.out.println("旧接口功能:"+oldMap);
//使用新接口功能
NewService nw = new NewServiceImpl();
Map<String, Object> newMap = nw.getUserInfo("7758520", "18513032646");
System.out.println("新接口功能:"+newMap);
//通过适配器,升级后依然兼容旧接口的功能
InterfaceAdapter adapter = new InterfaceAdapter(old);
oldMap = adapter.getUserInfo("7758820", "18513032646");
System.out.println(oldMap);
}
}
【案例二】:
就是阿富汗女子环游世界,在不同的国家遇到充电的问题,适配器模式也能帮你解决了,设计思想还是不变,只是看你怎么理解了,设计模式这东西吧,看是看不来的,看多了只会浮躁我今天早上刚入手时,看了半天理论找了半天例子,一头雾水,一个Demo下来,详细斟酌了一会儿感觉到模式还是模式啊,自有它的强大之处,不说了,还是看码吧。
/**
* 适配器模式
* 需求:一位阿富汗女子环游世界,首先她到中国爬长城顺便买了一个手机充电器给手机充电,接着打算去德国柏林找一个男朋友,可是到了德国她想给手机充电,
* 但是问题来了,在德国插座的插头只能是2个圆头插头,但是中国充电器的插头是2/3个扁平插头,所以无法使用。
*/ /**
* 测试
*/
public class Adapter {
public static void main(String[] args) {
//在德国使用德国充电器进行充电
DBSocketInterface dbSocket = new DBSocket();
dbSocket.DBCharge(); //在中国使用中国充电器进行充电
GBSocketInterface gbSocket = new GBSocket();
gbSocket.GBCharge(); //在德国使用中国充电器进行充电
SocketAdapter adapter = new SocketAdapter(gbSocket);
adapter.DBCharge();
}
} /**
* 手机电源适配器,为了能够让阿富汗女子在德国正常使用中国的手机充电器。
*/
class SocketAdapter implements DBSocketInterface{ //既然来到德国,就必须使用德国插座充电,实现德国插座接口 //因为该适配器是针对中国插座的,所以在创建适配器对象时必须传入中国插座接口的实现类对象
private GBSocketInterface gbSocket; //中国插座接口
public SocketAdapter(GBSocketInterface gbSocket) {
this.gbSocket = gbSocket;
} //经过适配器的转换,中国的充电器就可以在德国的插座上正常充电了
@Override
public void DBCharge() {
System.out.println("在德国,经过电源适配器转换*****");
gbSocket.GBCharge();
} } /**
* 德国插座(2个圆头的插头)
*/
interface DBSocketInterface{
//德国插座充电
void DBCharge();
}
/**
* 使用德国插座给手机充电
*/
class DBSocket implements DBSocketInterface{
@Override
public void DBCharge() {
System.out.println("2个圆头插头充电");
}
} /**
* 中国插座(2/3个扁平的插头)
*/
interface GBSocketInterface{
//中国插座充电
void GBCharge();
}
/**
* 使用中国插座给手机充电
*/
class GBSocket implements GBSocketInterface{
@Override
public void GBCharge() {
System.out.println("2/3个扁平插头充电");
}
}
还是那句话,目标还是目标,23种设计模式的学习一直在路上。
Java设计模式之适配器设计模式(项目升级案例)的更多相关文章
- Java设计模式之适配器模式(项目升级案例)
今天是我学习Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一遍 ...
- Java设计模式之适配器设计模式
1.适配器模式( Adapter)定义将一个类的接口转换成客户希望的另外一个接口.Adapter 模式使得原来由于接口不兼容而不能一起工作的 那些类可以一起工作. 现实案例如下: 墙上电源类(22 ...
- 适配器设计模式初探(Java实现)
本篇随笔主要介绍Java实现设配器设计模式. 先来看下待解决的问题: (图片转自http://blog.csdn.net/jason0539) 由上图的情况可知,欧洲壁式插座只有三足插口,如果我们想要 ...
- Java适配器设计模式
适配器设计模式,一个接口首先被一个抽象类先实现(此抽象类通常称为适配器类),并在此抽象类中实现若干方法(但是这个抽象类中的方法体是空的),则以后的子类直接继承此抽象类,就可以有选择地覆写所需要的方法. ...
- JAVA基础—适配器设计模式
适配器概念 在计算机编程中,适配器模式将一个类的接口适配成用户所期待的.使用适配器,可以使接口不兼容而无法在一起工作的类协调工作,做法是将类自己包裹在一个已经存在的类中. JDK对适配器设计模式的应用 ...
- 黑马程序员——JAVA基础之简述设计模式
------- android培训.java培训.期待与您交流! ---------- 设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用.多数人知晓 ...
- Java实现23种设计模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- Java基础-Java中23种设计模式之常用的设计模式
Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...
- Java 开发23种设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
随机推荐
- Gmail 设置,时区
问题提出: 我们工作的时候,需要和不同时区的人进行合作.我们需要注意时区问题.如果没有设置好时区,会造成很多不便. 了解时区问题: 通过 这个网站可以,让你对时区有所了解:http://zh.thet ...
- history历史记录控制
往往我们操作的每一条命令都会被机器记录下来,所有我们为了安全需要屏蔽掉某些敏感的操作命令. 设置linux默认的历史记录数: 临时生效: export HISTSIZE=5 history 永久生效 ...
- 从PFX文件中获取私钥、公钥证书、公钥
https://blog.csdn.net/ZuoYanYouYan/article/details/77868584 该类具体功能:根据pfx证书得到私钥.根据私钥字节数组获取私钥对象.根据公钥字节 ...
- 深度访谈Amazon员工与HR:华裔因pip跳楼背后(图)
http://www.wenxuecity.com/news/2016/12/01/5813342.html 首先,让我们来回顾一下这起事件.两天前在某论坛中,有同学发了这么一个帖子,大致意思是说有一 ...
- Python学习--Selenium模块简单介绍(1)
简介及运行流程 Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozi ...
- 乘风破浪:LeetCode真题_039_Combination Sum
乘风破浪:LeetCode真题_039_Combination Sum 一.前言 这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...
- Hexo搭建博客笔记
Hexo搭建(建议看ppt:https://files.cnblogs.com/files/-SANG/%E4%BD%A0%E7%9A%84%E7%8C%AB.pptx ) 安装Git https:/ ...
- October 14th 2017 Week 41st Saturday
I was well beaten myself, and I am beffer for it. 我自己也被打败过,但我因此变得更好. For most of us, the life road c ...
- Hash Tables
哈希表 红黑树实现的符号表可以保证对数级别的性能,但我们可以做得更好.哈希表实现的符号表提供了新的数据访问方式,插入和搜索操作可以在常数时间内完成(不支持和顺序有关的操作).所以,在很多情况下的简单符 ...
- 探索C#字符串
一.前言 刚接触C#时,书上说string是一种特殊的引用类型,因此string类型变量在作为参数传递到另一个方法,被修改后原变量的值不会发生变化,当时看得我一脸懵逼,什么叫特殊....后来又听说字符 ...