1.定义
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
简单来说:Adapt模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作!
2.概述
适配器模式就是将一个类的接口(被适配者)转换成客户希望的另外一个(目标)的成熟模式,该模式中涉及目标,被适配者,适配器。生活中的适配器模式的运用如下所示:
1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。
2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。
3、在 LINUX 上运行 WINDOWS 程序。
4、JAVA 中的 jdbc。
3.应用场景
一个程序想要使用已经存在的类,但该类所实现的接口和当前程序所使用的接口不一致。
4.模式的结构和使用
对象适配器模式的结构中包括三种角色
1.目标(target):目标是一个接口,该接口是客户想要使用的接口。
2.被适配者(Adaptee):被适配者是一个已经存在的接口或抽象类,这个接口或抽象类需要被适配。
3.适配器(Adapt):适配者是一个类,该类实现了目标接口并包含有适配者的引用,即适配者的职责是对被适配者接口(抽象类)与目标接口进行适配。
1.适配器模式的UML类图
2.结构的描述
以下通过一个简单的问题来描述适配器模式中所涉及的各个角色。
用户已经有一个两相的插座,但最近用户又有了一个新的三相插座。用户现有一台洗衣机和一台电视机,洗衣机按着三相插座的标准配有三相插头,而电视机按着两相插座的标准配有两相插头,现在用户想用新的三相插座来使用洗衣机和电视机,即用新的三相插座为洗衣机和电视机接通电流。
1.目标(Target)
本问题中,目标(Target)的类名是ThreeElectricOutlet,用来刻画三相插座。
package com.xing.adapt;
//用来刻画三相插座
public interface ThreeElectricOutlet {
public abstract void connectElectricCurrent();
}
2.被适配者(Adaptee)
被适配者的类名是TwoElectricOutlet,用来刻画两相插座。
package com.xing.adapt;
//刻画两相插座
public interface TwoElectricOutlet {
public abstract void connectElectricCurrent();
}
3.适配者
适配器的类名是TreeElectricAdapter,实现了ThreeElectricOutlet接口,即目标接口,并且包含TwoElectricOutlet的引用,即被适配者的引用。
package com.xing.adapt;
public class TreeElectricAdapter implements ThreeElectricOutlet{
TwoElectricOutlet outlet;
public TreeElectricAdapter(TwoElectricOutlet outlet) {
this.outlet = outlet;
}
@Override
public void connectElectricCurrent() {
outlet.connectElectricCurrent();
}
}
4.测试程序
在测试程序类中电仪了Wash(洗衣机)类和TV(电视)类,Wash
类实现了三相插座接口,TV实现了二相插座接口,因此Wash可以直接使用插座,但是TV需要经过适配器的适配才能使用三相插座!
package com.xing.adapt;
public class Application {
public static void main(String[] args) {
ThreeElectricOutlet outlet;//目标接口
outlet= new Wash();//洗衣机插在三相插座上
System.out.println("使用三相插座接通电流");
outlet.connectElectricCurrent();//接通电源开始洗衣服
outlet= new TreeElectricAdapter(new TV());
System.out.println("使用三相插座接通电流");
outlet.connectElectricCurrent();//接通电源开始播放电视节目
}
}
//洗衣机
class Wash implements ThreeElectricOutlet{//洗衣机使用三相插座
String name;
public Wash() {
name = "黄河洗衣机";
}
public Wash(String name) {
this.name = name;
}
public void turnOn(){
System.out.println(name+"开始洗衣服");
}
@Override
public void connectElectricCurrent() {
turnOn();
}
}
//电视机
class TV implements TwoElectricOutlet{//电视机使用两相插座
String name;
public TV() {
name = "液晶电视机";
}
public TV(String name) {
this.name = name;
}
public void turnOn(){
System.out.println(name+"开始播放电视节目");
}
@Override
public void connectElectricCurrent() {
turnOn();
}
}
5.测试结果展示
5.适配器模式的优点
1.目标(Target)和被适配者(Adaptee)是完全解耦的关系。
2.适配器模式满足开闭原则。当添加一个实现Adaptee接口的新类时,不必修改Adapter,Adapter就能对这个新类的实例进行适配。