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)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
随机推荐
- Oracle EBS OM 删除订单行
DECLARE l_header_rec OE_ORDER_PUB.Header_Rec_Type; l_line_tbl OE_ORDER_PUB.Line_Tbl_Type; l_action_r ...
- Redis集群迁移
1:开发中断程序,登录各个主节点查看key信息 INFO # Keyspace db0:keys,expires,avg_ttl # Keyspace db0:keys,expires,avg_ttl ...
- Linux centos6.5 系统语言改成中文简体
有时候上传的文件在linux上ls显示的时乱码,原因可能是系统语言编码问题,以Linux centos6.5为例,解决方法如下: 1.在root(皇帝)权限下更改: 查看当前所有语言环境:locale ...
- 搭建spark集群
搭建spark集群 spark1.6和hadoop2.61.准备hadoop环境:2.准备下载包:3.解压安装包:tar -xf spark-1.6.0-bin-hadoop2.6.tgz4.修改配置 ...
- php 错误1
Maximum execution time of 30 seconds exceeded 方法一,修改php.ini文件 max_execution_time = 30; Maximum execu ...
- 聊聊MySQL的子查询
1. 背景 在之前介绍MySQL执行计划的博文中已经谈及了一些关于子查询相关的执行计划与优化.本文将重点介绍MySQL中与子查询相关的内容,设计子查询优化策略,包含半连接子查询的优化与非半连接子查询的 ...
- Linux基础第一课——基础知识了解
前言 发展历史 linus 林纳斯 赫尔辛基大学 在自己的笔记本上安上自己写的操作系统 基于Linux内核 Linux内核 也是基于unix内核开发出来 unix 不开源 只能军方和大学使用 Linu ...
- zabbix_windowsagent_cpu
zabbix的WEB端--配置-模板--Template OS Windows--项目--创建项目 名称:UserPerfCountercpu 键值:UserPerfCountercpu 数据类型:数 ...
- linux添加磁盘空间
首先你要关掉系统,把分配的硬盘空间变大,或者重新建立一个虚拟硬盘(这时下面的就不是sda了,而是sdb1了).这两种方法都可行,我都试过了.其次用root用户登录到你的linux系统,查看你系统的分区 ...
- BZOJ4269:再见Xor(线性基)
Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整数N. 接下来一行N个非负整数. ...