设计模式-07-适配器模式

设计模式-07-适配器模式

个人github地址:HibisciDai

设计模式系列项目源码:HibisciDai/DesignPattern-LearningNotes-HibisciDai

processon在线UML类图:processon

[TOC]

设计模式-07-适配器模式

适配器模式(Adapter Pattern)

意图

将一个类的接口转换成客户希望的另外一个接口。
适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

主要解决

在软件系统中,常常要将一些”现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的。

何时使用

  • 系统需要使用现有的类,而此类的接口不符合系统的需要。
  • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
  • 通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

关键代码

适配器继承或依赖已有的对象,实现想要的目标接口。

如何解决

继承或依赖。

应用实例

  • 美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。
  • JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。
  • 在 LINUX 上运行 WINDOWS 程序。
  • JAVA 中的 jdbc。

优点

  • 可以让任何两个没有关联的类一起运行。
  • 提高了类的复用。
  • 增加了类的透明度。
  • 灵活性好。

缺点

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
  • 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

注意事项

适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

适用性

  • 一个已经存在的类,单接口不符合要求。
  • 创建一个可复用的类,可与其他不相关的类或不可预见的类协同工作。
  • 使用一些已经存在的子类,但不可能对每一个都进行子类画以匹配他们,接口对象适配器可以适配它的父类接口。

案例1

原来的MyPicture类中通过GetRGB()获得图像的RGB值,代码更新。
在NewPicture类中使用getR()、getG()、getB()方法获得图像的RGB值。

案例1-实现1

类图

代码

pattern07.adapter.demo1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public interface IPicture {
void getRGB();
}
public class MyPicture implements IPicture {
@Override
public void getRGB() {
System.out.println("MyPicture-" + "getRGB");
}
}
public class PictureAdapter implements IPicture {
@Override
public void getRGB() {
NewPicture np = new NewPicture();
np.getR();
np.getG();
np.getB();
}
}
public class NewPicture {
void getR() {
System.out.println("NewPicture-" + "R");
}

void getG() {
System.out.println("NewPicture-" + "G");
}

void getB() {
System.out.println("NewPicture-" + "B");
}
}

测试输出

1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
IPicture p = new PictureAdapter();
p.getRGB();
}
}
1
2
3
NewPicture-R
NewPicture-G
NewPicture-B

案例1-实现2

类图

代码

pattern07.adapter.demo2

仅更改Adapter类

1
2
3
4
5
6
7
8
9
public class PictureAdapter extends NewPicture implements IPicture {
@Override
public void getRGB() {
NewPicture np = new NewPicture();
np.getR();
np.getG();
np.getB();
}
}
文章作者: HibisciDai
文章链接: http://hibiscidai.com/2018/04/04/设计模式-07-适配器模式/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HibisciDai
好用、实惠、稳定的梯子,点击这里