一、基础简介
1、定义
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
2、使用场景
- 1、系统需要使用现有的类,而此类的接口不符合系统的需要。
- 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
- 3、通过接口转换,将一个类插入另一个类系中。
3、优缺点
优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。
缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
4、适配器模式结构分析
- Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
- Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
- Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。
二、代码实现
场景:将外国人说的话翻译成中文
1、Target(目标抽象类):目标抽象类定义客户所需接口
package com.mfc.design.适配器模式.实例;
/**
* @author MouFangCai
* @date 2019/10/18 15:48
*
* Target(目标抽象类):目标抽象类定义客户所需接口
*/
public abstract class Foreigner_Target {
private String name;
public Foreigner_Target(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void speak();
}
package com.mfc.design.适配器模式.实例;
/**
* @author MouFangCai
* @date 2019/10/18 15:52
*
* 具体的目标类
*/
public class American extends Foreigner_Target {
public American(String name) {
super(name);
}
@Override
public void speak() {
System.out.println( getName() + ": This is an American");
}
}
2、Adaptee(适配者类):适配者即被适配的角色
package com.mfc.design.适配器模式.实例;
/**
* @author MouFangCai
* @date 2019/10/18 16:01
*
* Adaptee(适配者类):适配者即被适配的角色
*/
public class Chinese_Adaptee {
private String name;
public Chinese_Adaptee(String name) {
this.name = name;
}
public void 说话(){
System.out.println( name + ": 这是一个美国人");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、Adapter(适配器类):作为一个转换器
package com.mfc.design.适配器模式.实例;
/**
* @author MouFangCai
* @date 2019/10/18 16:04
*
* Adapter(适配器类):作为一个转换器
*/
public class Translator_Adapter extends Foreigner_Target {
private Chinese_Adaptee adaptee = new Chinese_Adaptee("中国人:");
public Translator_Adapter(String name) {
super(name);
adaptee.setName(name);
}
// 翻译者将“Foreigner_Target”说的话,翻译为 中国人 说的话
@Override
public void speak() {
adaptee.说话();
}
}
4、客户端测试
package com.mfc.design.适配器模式.实例;
/**
* @author MouFangCai
* @date 2019/10/18 16:07
*/
public class Client_Adapter {
public static void main(String[] args) {
Foreigner_Target target = new American("American");
target.speak();
Foreigner_Target target1 = new Translator_Adapter("翻译官");
target1.speak();
}
}
5、结果
American: This is an American
翻译官: 这是一个美国人Process finished with exit code 0
网友评论