Java设计模式之适配器模式Adapter(结构型)
来源:互联网 发布:涂鸦制作软件 编辑:程序博客网 时间:2024/05/16 05:48
第一次见到适配器模式的时候,很佩服为设计模式命名的人,因为他们真的很符合这个名字,做到了见名知意;
概述:
在我们的开发中业务会经常的变化,接口也会做出相应的改变,而这些又是我们不得不去面对的事情,这个时候我们可以用到适配器这个模式,他将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于不兼容而不能一起工作的哪些类可以一起工作;
适配器角色:
目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
需要适配的类(Adaptee):需要适配的类或适配者类。
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
适配器的经典实现:
适配器是英语Adapter/adaptor的汉语翻译。适配器就是一个接口转换器,它可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口。比如:电源适配器、三角架基座转接部件、USB与串口的转接设备等。
结构
类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图所示:
对象匹配器依赖于对象组合,如下图所示:
实例:
假设我们最开始设计了一个安卓的充电器,后来我们想让这个接口也可以满足Iphone充电器怎么办啦
针对这样的兼容性决办法就是创建一个适配器(Adapter)。
类适配器使用的是继承:
/** * 类适配器模式 * @author lyg * */ /** * 目标角色 * @version 2.0 */ interface Target { /*/ * 充电器接口 */ public void charger(String type); }/** * 源角色:被适配的角色 * @version 2.0 */ class Adaptee{public void PhoneCharger(){System.out.println("我是一个iphone充电器");}}/** * 类适配器角色 */ class Adapter extends Adaptee implements Target{@Overridepublic void charger(String type) {if("android".equals(type)){System.out.println("我是一个安卓充电器");}if("Iphone".equals(type)){PhoneCharger();}}}
public class Test {/*/ * main方法,模拟客户端调用 */public static void main(String[] args) {Adapter adapter=new Adapter();adapter.charger("Iphone");}}
这样以后,以后如果程序再变动,我们也可以只需要增加适配器角色就可以满足需求;
对象适配器使用的是委派:
/** * 类适配器模式 * @author lyg * */ /** * 目标角色 * @version 2.0 */ interface Target { /*/ * 充电器接口 */ public void charger(String type); }/** * 源角色:被适配的角色 * @version 2.0 */ class Adaptee{public void PhoneCharger(){System.out.println("我是一个iphone充电器");}}/** * 类适配器角色 */ class Adapter implements Target{public Adaptee adaptee;@Overridepublic void charger(String type) {if("android".equals(type)){System.out.println("我是一个安卓充电器");}if("Iphone".equals(type)){adaptee.PhoneCharger();}}public Adapter(Adaptee adaptee) {super();this.adaptee = adaptee;}
public class Test {/*/ * main方法,模拟客户端调用 */public static void main(String[] args) {Adaptee adaptee=new Adaptee();Adapter adapter=new Adapter(adaptee);adapter.charger("Iphone");}}
如例中代码所示,你可以运用适配器(Adapter)模式来避免因外部库改变所带来的不便——倘若向上兼容。作为某个库的开发者,你应该独立编写适配器,使你的用户更简便地使用新版本的库,而不用去修改他们现有的全部代码。
GoF书中提出的适配器(Adapter)模式更倾向于运用继承而不是组成。这在强类型语言中是有利的,因为适配器(Adapter)事实上是一个目标类的子类,因而能更好地与类中方法相结合。
模式总结
优点
1 通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
2 复用了现存的类,解决了现存类和复用环境要求不一致的问题。
3 将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
4 一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
2 缺点
对于对象适配器来说,更换适配器的实现过程比较复杂。
3 适用场景
3.1 系统需要使用现有的类,而这些类的接口不符合系统的接口。
3.2 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3.3 两个类所做的事情相同或相似,但是具有不同接口的时候。
3.4 旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
3.5 使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。
适配器应用举例
1 使用过ADO.NET的开发人员应该都用过DataAdapter,它就是用作DataSet和数据源之间的适配器。DataAdapter通过映射Fill和Update来提供这一适配器。
2 手机电源适配器
- Java设计模式之适配器模式Adapter(结构型)
- 设计模式(结构型)之适配器模式(Adapter Pattern)
- 【结构型模式】适配器(adapter)模式之23种java设计模式
- Java设计模式之结构型模式-适配器模式(Adapter)
- JAVA设计模式(6) —<结构型>适配器模式(Adapter)
- 结构型设计模式---适配器模式(adapter)
- Java 设计模式 接口型模式 之 适配器Adapter模式
- Java:设计模式之适配器模式Adapter
- java设计模式之适配器模式Adapter
- [设计模式-结构型]适配器(Adapter)
- JAVA设计模式系列之Adapter(适配器)
- java 设计模式之适配器Adapter
- Java:设计模式之适配器Adapter(续)
- Java设计模式之适配器(Adapter)
- Java设计模式之适配器(Adapter)
- java设计模式之— 适配器(Adapter)
- Java设计模式之适配器Adapter
- Java设计模式之适配器(Adapter)
- pv原语的定义及解释理解
- 《Eclipse.Rich.Client.Platform》4章 The Hyperbola Application
- 172. Factorial Trailing Zeroes [easy] (Python)
- 第十二周项目一(1)-实现复数类中的运算符重载
- 进制
- Java设计模式之适配器模式Adapter(结构型)
- 利用 JSP 2 提供的 SimpleTagSupport 开发自定义标签
- Android开发之实现百度地图定位功能
- C++实验7-特殊三位数
- Kafka linux集群部署
- c++函数重载和函数覆盖的区别
- Java 数据结构之栈的基本实现
- 彻底解决Spring MVC 中文乱码 问题
- J2ee项目从0搭建(六):Spring MVC集成