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)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
随机推荐
- 全面认识一下.NET 4.0的缓存功能 (转)
转自:http://www.cnblogs.com/hjf1223/archive/2010/07/16/net_4_caching.html 很多关于.NET 4.0新特性的介绍,缓存功能的增强肯定 ...
- 解决windows下vim中文乱码
解决windows下vim中文乱码 windows安装了vim8,也就是gvim后,打开带有中文的文档,显示中文是乱码. 毕竟有许多文档我是用utf-8编码的,所以解决的办法是设置一下编码为utf-8 ...
- gnome美化
调整工具更新可以移动窗口控件gnome-tweak-tool # dnf install gnome-tweak-tool 命令行启动,并且要在普通用户下启动 $ gnome-tweak-tool 在 ...
- MySQL基础之 标准模式通配符
MySQL标准魔兽通配符 作用:在搜索数据库中的数据时,SQL通配符可以替代一个或多个字符 注意:标准模式SQL通配符必须与LIKE运算符一起使用 1.% 通配符 作用:匹配一个或多个字符. 找出以 ...
- Java的数组堆溢出问题
在写测试方法的时候,生成了一个数组,之后报了堆溢出错误,这样的报错一般来说只要有一些JVM的基础都知道要用-Xmx.-Xms来开更大的堆,接下来看看我碰到的一个堆溢出的问题 在测试代码中开了一个500 ...
- 2-2 R语言基础 向量
#Vector 向量的三种创建方法,两个参数:类型,长度 > x <- vector("character",length=10)> x1 <- 1:4&g ...
- swift的多态
协议多态: 函数式编程多态:高阶函数的多态性: 泛型多态:泛型的基于约束编程: 共同点:相同的接口,不同的行为:
- BZOJ4401:块的计数(乱搞)
Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构——块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对这种事情毫无兴趣,只是 ...
- oracle 更新用户密码,授连接权限,
1.授连接权限 grant connect to 用户名; ALTER USER 用户名 ACCOUNT UNLOCK; 2.更新密码 ALTER USER 用户名 IDENTIFIED BY 更新密 ...
- JAVA框架 Spring 事务
一.我们之前在hibernate的时候,需要直接写事务,需要绑定当前线程保证获取同一个连接,虽然hibernate的帮我们封装绑定当前现成的操作,但是需要我们手动的去开启和关闭事务. 而spring帮 ...