适配器模式
说明
适配器模式(Adapter Pattern)属于结构型模式,又叫变压器模式,它的功能是将一个类的接口变成客户端所期望的另一个接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作。
当一个客户需要一个目标接口,但这个目标接口没有具体的实现,同时有一个源接口有客户端需要的内容,却又不能直接使用。这时就需要一种临时的解决方案做兼容,将源接口转换为目标接口。
结构
适配器模式的主要角色如下:
目标角色(Target):所期望的接口,可以是具体或抽象的类,也可以是接口;
源角色(Adaptee):包含客户端所需要的内容,但是客户端不能直接使用;
适配器(Adapter):将源角色(Adaptee)转化为目标角色(Target)的类。
代码案例
适配器模式有3中实现方式:类适配器、对象适配器、接口适配器
类适配器
类适配器使用继承源角色实现目标接口的方式进行兼容
/**
* @program: adapter
* @description: 英语,源接口要实现的抽象
* @author: wxw
* @create: 2022-03-07 15:29
**/
public interface IEnglish {
/**
* 响应
* @return
*/
String response();
}
/**
* @program: adapter
* @description: 老外类,也就是源角色,只会说英文
* @author: wxw
* @create: 2022-03-07 15:31
**/
@Data
public class Foreigner implements IEnglish {
private String name;
@Override
public String response() {
return "Foreigner:Hi, you're on Sunset Boulevard.";
}
}
/**
* @program: adapter
* @description: 汉语,客户端所期望的接口
* @author: wxw
* @create: 2022-03-07 15:27
**/
public interface IChinese {
/**
* 响应
* @return
*/
String response();
}
/**
* @program: adapter
* @description: 翻译员,适配器类,负责将源接口的内容转换成目标接口
* @author: wxw
* @create: 2022-03-07 15:35
**/
public class LinguisterAdapter extends Foreigner implements IChinese {
public LinguisterAdapter(String name) {
this.setName(name);
}
@Override
public String response() {
String msg = super.response();
System.out.println("翻译员接收到的信息:" + msg);
msg = "你好,你所在的位置是落日大道。";
System.out.println("翻译员翻译后的信息:" + msg);
return msg;
}
}
/**
* @program: adapter
* @description: 客户端类
* 张三在国外与朋友走失,人生地不熟,向老外问路。
* @author: wxw
* @create: 2022-03-07 15:38
**/
public class ZhangSan {
// 反例
public void askTheWay1(){
System.out.println("张三:老外你好,我是过来旅游的与朋友们走失了,你能告诉我现在的位置吗?我朋友会过来找我。");
Foreigner foreigner = new Foreigner();
System.out.println(foreigner.response());
System.out.println("张三:…… 王德发,你说的啥?");
}
// 正例,使用翻译员与老外沟通
public void askTheWay2(){
System.out.println("张三:老外你好,我是过来旅游的与朋友们走失了,你能告诉我现在的位置吗?我朋友会过来找我。");
IChinese linguister = new LinguisterAdapter("jack");
System.out.println("翻译员:老外说:" + linguister.response());
}
}
测试结果:
张三:老外你好,我是过来旅游的与朋友们走失了,你能告诉我现在的位置吗?我朋友会过来找我。
翻译员接收到的信息:Foreigner:Hi, you're on Sunset Boulevard.
翻译员翻译后的信息:你好,你所在的位置是落日大道。
翻译员:老外说:你好,你所在的位置是落日大道。
对象适配器
对象适配器将源角色作为成员变量来实现兼容
/**
* @program: adapter
* @description: 翻译员,适配器类,负责将源接口的内容转换成目标接口
* @author: wxw
* @create: 2022-03-07 15:35
**/
public class LinguisterAdapter implements IChinese {
private Foreigner foreigner;
public LinguisterAdapter(Foreigner foreigner) {
this.foreigner = foreigner;
}
@Override
public String response() {
String msg = foreigner.response();
System.out.println("翻译员接收到的信息:" + msg);
msg = "你好,你所在的位置是落日大道。";
System.out.println("翻译员翻译后的信息:" + msg);
return msg;
}
}
接口适配器
接口适配器的使用场景是有多个不同需求的客户端都需要源角色的内容,Adapter对象需要做不同的兼容操作。
/**
* @program: adapter
* @description: 语言接口,定义不同客户端的目标需求
* @author: wxw
* @create: 2022-03-07 16:05
**/
public interface ILanguage {
// 响应中文
String responseChinese();
// 响应韩语
String responseKorean();
// 响应德语
String responseFrench();
// 响应法语
String responseGerman();
}
/**
* @program: adapter
* @description: 翻译员,适配器类,负责将源接口的内容转换成目标接口
* @author: wxw
* @create: 2022-03-07 15:35
**/
public class LinguisterAdapter implements ILanguage {
private Foreigner foreigner;
public LinguisterAdapter(Foreigner foreigner) {
this.foreigner = foreigner;
}
@Override
public String responseChinese() {
String msg = foreigner.response();
System.out.println("翻译员接收到的信息:" + msg);
msg = "你好,你所在的位置是落日大道。";
System.out.println("翻译员翻译后的信息:" + msg);
return msg;
}
@Override
public String responseKorean() {
return null;
}
@Override
public String responseFrench() {
return null;
}
@Override
public String responseGerman() {
return null;
}
}