Java描述设计模式(07):适配器模式
一、适配器模式简介
1、基础概念
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式有类适配器模式和对象适配器模式,以及缺省(接口)适配器,三种不同的形式。
2、生活场景
基于适配器模式,把220V的电压,转换为需要的110V电压。
public class C01_InScene {public static void main(String[] args) {CurrentAdapter adapter = new CurrentAdapter() ;System.out.println(adapter.get110VCurrent()) ;}
}
// 220V电流
class Current220V {public int get220VCurrent (){return 220 ;}
}
// 110V电流接口
interface Current110V {int get110VCurrent () ;
}
// 电流适配器
class CurrentAdapter extends Current220V implements Current110V {// 电流转换方法@Overridepublic int get110VCurrent() {int high = get220VCurrent() ;int low = high/2 ;return low ;}
}
二、类适配器
1、模式简介
类的适配器模式把适配的类的API转换成为目标类的API。
2、核心角色
- 目标(Target)角色
这就是所期待得到的接口。
- 源(Adapee)角色:
现在需要适配的接口。
- 适配器(Adaper)角色
适配器类是本模式的核心。适配器把源接口转换成目标接口。
3、源码实现
interface Target {void sampleOperation1();void sampleOperation2();
}
class Adaptee {public void sampleOperation1(){System.out.println("Adaptee.sampleOperation1()");}
}
class Adapter extends Adaptee implements Target{@Overridepublic void sampleOperation2() {System.out.println("Adapter.sampleOperation2()");}
}
三、对象适配器
1、模式简介
与类的适配器模式一样,对象的适配器模式把被适配的类的API转换成为目标类的API,与类的适配器模式不同的是,对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用委派关系连接到Adaptee类。
2、源码实现
interface Target1 {void sampleOperation1();void sampleOperation2();
}
class Adaptee1 {public void sampleOperation1(){System.out.println("Adaptee.sampleOperation1()");}
}
class Adapter1 implements Target1 {private Adaptee1 adaptee ;public Adapter1 (Adaptee1 adaptee){this.adaptee = adaptee;}public void sampleOperation1() {this.adaptee.sampleOperation1();}@Overridepublic void sampleOperation2() {System.out.println("Adapter.sampleOperation2()");}
}
四、接口适配器
1、模式简介
缺省(接口)适配(Default Adapter)模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。
2、源代码实现
public class C04_AdapterInte {public static void main(String[] args) {ServiceAdapter adapter = new ServiceAdapter(){@Overridepublic int serviceOperation2() {return 22 ;}};System.out.println(adapter.serviceOperation2());}
}
interface AbstractService {void serviceOperation1();int serviceOperation2();String serviceOperation3();
}
class ServiceAdapter implements AbstractService{@Overridepublic void serviceOperation1() {}@Overridepublic int serviceOperation2() {return 0;}@Overridepublic String serviceOperation3() {return null;}
}
五、Spring框架应用
1、应用场景描述
在SpringMvc执行控制执行请求的时候,有这样一个流程
1)前段控制器DispatcherServlet调用处理器适配器去执行Handler(也就是Controller);
2)处理器适配器去执行Handler,给适配器返回ModelAndView ;
3)处理器适配器向前端控制器返回ModelAndView ;
2、流程分析
- 核心接口和实现
Controller和HandlerAdapter两核心接口。
- HandlerAdapter
适配器接口,使Handler有对应的适配器实现类,适配器代替Handler(控制层Controller)执行相应的方法。
public interface HandlerAdapter {// 判断类型是否匹配boolean supports(Object var1);// 执行方法,返回ModelAndViewModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
}
supports()方法传入处理器,判断适配器是否支持,如果支持则返回支持的适配器实现类。
- DispatchServlert
抽取源码中体现流程的几个步骤。
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {HandlerExecutionChain mappedHandler = null;mappedHandler = this.getHandler(processedRequest);HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());mv = ha.handle(processedRequest, response, mappedHandler.getHandler());mappedHandler.applyPostHandle(processedRequest, response, mv);
}
- SimpleControllerHandlerAdapter
最后看下supports和handle两个方法的具体实现。
public class SimpleControllerHandlerAdapter implements HandlerAdapter {public SimpleControllerHandlerAdapter() {}public boolean supports(Object handler) {return handler instanceof Controller;}public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return ((Controller)handler).handleRequest(request, response);}
}
六、适配器优缺点
1、优点分析
更好的复用性,系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。更好的扩展性。
2、缺点分析
过多的使用适配器,会让系统非常零乱,不易整体进行把控。
七、源代码地址
GitHub地址:知了一笑
https://github.com/cicadasmile
码云地址:知了一笑
https://gitee.com/cicadasmile
Java描述设计模式(07):适配器模式相关推荐
- Java描述设计模式(05):原型模式
一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...
- Java描述设计模式(11):观察者模式
本文源码:GitHub·点这里 || GitEE·点这里 一.观察者模式 1.概念描述 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.观察者模式定义了一种一对多 ...
- Java描述设计模式(09):装饰模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 孙悟空有七十二般变化,他的每一种变化都给他带来一种附加的本领.他变成鱼儿时,就可以到水里游泳:他变成鸟儿时,就可以 ...
- Java描述设计模式(24):备忘录模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时, ...
- Java描述设计模式(15):责任链模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...
- Java描述设计模式(08):桥接模式
本文源码:GitHub·点这里 || GitEE·点这里 一.桥接模式简介 1.基础描述 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥 ...
- Java描述设计模式(12):外观模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 在移动互联网没有普及之前,去饭店吃饭的流程大致如下:选座位,排队,点菜,结账.后来移动互联网普及,通过手机APP就 ...
- Java描述设计模式(03):工厂方法模式
一.工厂方法模式 1.生活场景 系统常见的数据导出功能:数据导出PDF.WORD等常见格式. 2.工厂方法模式 是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性 ...
- Java描述设计模式(02):简单工厂模式
一.生活场景简介 1.引入场景 订餐流程简单描述 1).食品抽象类,规定食品的基础属性操作 2).鱼类,鸡肉类食品类扩展 3).订餐流程类,根据食品名称,加工指定类型食品 4).模拟客户端预定操作 2 ...
最新文章
- Asp.net mvc 添加Jquery UI
- java达达租车接口_Java第一个项目——达达租车系统v1
- unity 畸变_unity3d 几种镜头畸变
- python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?
- Mac下和Windows下UnrealEngine 4体验对比
- 玩转SpringSession,重要知识点全面剖析(续篇)
- opencv之计算机视觉介绍(笔记01)
- 百度贴吧 2017 前贴子无法访问;网易腾讯游戏获批;苹果反垄断案败诉 | 极客头条...
- mac 使用 pf 做端口转发
- Matplotlib中文乱码解决方案(1):`matplotlib.font_manager` 自定义字体
- CCNA考试题库中英文翻译版及答案5
- Jquery+flash在线图片裁剪
- 人际关系差不能当跳槽理由,原因在这里
- unreal-教程-第十八章:UI跟随的基本原理(c++)
- python 树莓派实验一:跑马灯
- MAX98390CEWX D类放大器,集成动态扬声器管理(MAX98390)
- linux下优盘格式化,linux下格式化u盘
- MacBook上有哪些适合运营人用的高效的软件工具和使用技巧
- Android--经典蓝牙(文件传输--socket通信)
- Python基于vs2013开发配置环境出错unsupported python version 3.7解决方案
热门文章
- 操作系统之I/O管理:3、设备的分配与回收(设备控制表DCT、控制器控制表COCT、通道控制表CHCT、系统设备表SDT、逻辑设备表LUT)
- 数据结构之顺序循环队列
- Python判断一个字符串是否可以转换为数字(字符串转数字、字符串转整形、字符串转int、字符串转浮点型)
- 生成证书密钥RequestsDependencyWarning:Old version of cryptography ([1, 2, 3]) may cause slowdown.
- Python 命令行解析器argparse及传参数详解
- PySpider问题记录http599
- UIAlertController 大坑
- 对于右侧文字过多会跑到左侧的问题
- Java虚拟机10:类加载器
- MySqlDataReader在Using中使用