文章目录
详解Java设计模式之适配器模式
结构型模式
结构型模式关注如何将现有类或对象组织在一起形成更加强大的结构。
不同的结构型模式从不同的角度组合类或对象,它们尽可能满足各种面向对象设计模式的同时为类或对象的组合提供一系列巧妙的解决方案。
结构型模式分类
类结构型模式
- 关心类的组合,由多个类组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系
对象结构型模式
- 关心类和对象的组合,通过关联关系,在一个类中定义另一个类的实例对象,然后通过该对象调用对应的方法。
结构性模式一览表
案例引入适配器模式
-
电源适配器
现实生活:生活用电220V,电脑笔记本20V。引入AC Adapter (交流电适配器)
软件开发:存在不兼容的结构,例如方法名不一致即,可以引入适配器模式。
适配器模式
定义
适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。
Adapter Pattern: Convert the interface of a class into another interface clients expect.Adapter lets classes work together that cloudn’t otherwise because of imcompatible interface.
- 既是对象结构型模式,又是类结构型模式
- 别名:包装器模式
- 定义中所指的接口是指广义的接口,他可以表示一个方法或者方法的集合。
适配器模式结构
类适配器
对象适配器
适配器的模式结构
- Target 目标抽象类
- Adapter 适配器类
- Adaptee 适配者类
实例分析
某公司欲开发一款儿童玩具汽车,为了更好地吸引小朋友的注意力,该玩具汽车在移动过程中伴随着灯光闪烁和声音提示。在该公司以往的产品中已经实现了控制灯光闪烁(例如警灯闪烁)和声音提示(例如警笛音效)的程序。
为了重用先前的代码并且使得汽车控制软件具有更好的灵活性和扩展性,现使用适配器模式设计该玩具汽车控制软件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H7azi8sQ-1639962485185)(https://pic.imgdb.cn/item/61b45f802ab3f51d91ed7e52.jpg)]
该案例的代码请见我的Gitee链接
https://gitee.com/plushuang/HelloWord/tree/master/src/csu/edu/cn/designpattern/adapterpatter/example
缺省适配器模式
缺省适配器模式(Default Adapter Pattern):当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求。
它适用于不想使用一个接口中的所有方法的情况,又称为单接口适配器模式。
public abstract class AbstractServiceClass implements ServiceInterface {
public void serviceMethod1() { } //空方法
public void serviceMethod2() { } //空方法
public void serviceMethod3() { } //空方法
}
双向适配器
类图结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AxfrVpTe-1639962485187)(https://pic.imgdb.cn/item/61bfd4f42ab3f51d91d845ca.jpg)]
典型代码片段
public class Adapter implements Target,Adaptee {
private Target target;
private Adaptee adaptee;
public Adapter(Target target) {
this.target = target;
}
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
adaptee.specificRequest();
}
public void specificRequest() {
target.request();
}
}
适配器模式的优点
- 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构
- 增加了类的透明性和复用性,提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用
- 灵活性和扩展性非常好
- 类适配器模式:置换一些适配者的方法很方便
- 对象适配器模式:可以把多个不同的适配者适配到同一个目标,还可以适配一个适配者的子类
适配器模式的缺点
- 类适配器模式:
- 一次最多只能适配一个适配者类,不能同时适配多个适配者
- 适配者类不能为最终类
- 目标抽象类只能为接口,不能为类
- 对象适配器模式:在适配器中置换适配者类的某些方法比较麻烦
模式适用环境
- 系统需要使用一些现有的类(适配者),而这些类的接口不符合系统的需要,甚至没有这些类的源代码
- 创建一个可以重复使用的类(目标类/适配者),用于和一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作