设计模式-适配器模式
来源:互联网 发布:手机传感器数据采集 编辑:程序博客网 时间:2024/05/21 09:07
这篇文章讲的是适配器模式,适配器模式其实在我们日常生活中就有许许多多的例子
例如插座转接头
车载充电器
还有许许多多其他的,我就不一一介绍了。其实设计模式中和真实世界中的适配器的作用都是一样的,都是讲一个结构转换成另一个接口,以达到我们希望的结果。
介绍
适配器模式(Adapter Pattern## 标题 ##)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。适配器模式将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式有两种类型:类适配器模式和对象适配器模式。因为类适配器需要通过多重继承进行适配,而JAVA又不支持多重继承,所以这里主要讲对象适配器,简单介绍类适配器。
结构图
对象适配器
类适配器
时序图
案例
这里就用插座转接头做案例。
当插座上只有一个三孔插座,而我们的手机充电器是两孔的,这时该怎么办你?这时候我们就需要用一个两孔插座转三孔插座的适配器来适配了。如下图
充电器类
public class Charger{ public void request(){ System.out.println("我是两孔插座的充电器!"); }}
插座接口
public interface Adaptee { void transaledRequest();}
三孔插座类
public class ThreeAdaptee implements Adaptee{ public void transaledRequest(){ System.out.println("插入三孔插座!"); }}
适配器类
public class Adapter extends Charger { private Adaptee adaptee; public Adapter(Adaptee adaptee) { super(); this.adaptee = adaptee; } @Override public void request() { super.request(); System.out.println("两孔转三孔!"); adaptee.transaledRequest(); }}
测试类
public class Client { public static void main(String[] args) { ThreeAdaptee adaptee = new ThreeAdaptee(); Adapter adapter = new Adapter(adaptee); adapter.request(); }}
测试结果
代码见Github地址
总结
适配器模式的主要优点是将目标类和适配者类解耦,增加了类的透明性和复用性,同时系统的灵活性和扩展性都非常好,更换适配器或者增加新的适配器都非常方便,符合“开闭原则”;类适配器模式的缺点是适配器类在很多编程语言中不能同时适配多个适配者类,对象适配器模式的缺点是很难置换适配者类的方法。
在类适配器模式中,适配器类实现了目标抽象类接口并继承了适配者类,并在目标抽象类的实现方法中调用所继承的适配者类的方法;在对象适配器模式中,适配器类继承了目标抽象类并定义了一个适配者类的对象实例,在所继承的目标抽象类方法中调用适配者类的相应业务方法。
- 设计模式:适配器模式
- 设计模式------适配器模式
- 设计模式:适配器模式
- 设计模式---适配器模式
- 设计模式 适配器模式
- 设计模式 - 适配器模式
- 设计模式--适配器模式
- 设计模式-适配器模式
- 设计模式------适配器模式
- 设计模式---适配器模式
- 设计模式- 适配器模式
- 设计模式 - 适配器模式
- 设计模式:适配器模式
- 适配器模式--设计模式
- 设计模式 - 适配器模式
- 设计模式-适配器模式
- 设计模式---适配器模式
- 设计模式-适配器模式
- 全局异常处理器
- 三级缓存之将图片添加到SD卡中
- 总结linux下使用mysql数据库出现 “Access denied for user 'root'@'localhost' (using password: YES)”
- 过滤器和监听器技术
- StringBuilder,StringBuffer,String 的区别
- 设计模式-适配器模式
- 数据结构-排序算法-分析(Java篇)
- 六、Spring Cloud系列:Config服务端与客户端常用配置
- 设计模式-命令模式
- 前端面试题:cookies,sessionStorage 和 localStorage 的区别?
- c++中const变量真的不可以修改吗?
- loadrunner Web_类函数之web_global_verification_pause()
- webpack打包项目实战。看我怎么分项目管理
- Centos7搭建Docker私有仓库极其遇到的问题