一、介绍
Adapter(适配器)也叫做包装器(wrapp)。在许多时候横夺得类不能够被复用,仅仅是因为将一个类的接口与专业应用得接口不匹配。当一些类的接口互不兼容,这时候就需要适配器。它能将一个类的接口转化为客户希望的另一个接口。Adapter模式使得由于接口不兼容不能在一起工作得那些类可以在一起工作。
- 优点:
1.类的透明性
2.类的复用度
3.灵活性
4.可以让任何两个没有关联的类一起运行 - PS:
项目一定要遵守依赖倒置原则和里氏替换原则,否则即使在适合使用适配器的场合下,也会带来非常大的改造
二、适用性
- 当你想使用一个已经存在的类,但他的接口不符合你的需求
- 当你想创建一个可以复用的类,该类可以与其他不相关的类或不可遇见的类(接口可能不一定兼容的类)一起协同工作
- 你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配他的父类接口。
三、参与者
- Target
定义Client使用的与特定邻域相关的接口 - Client
与符合Target接口的对象协同 - Adaptee
定义一个已经存在的接口,这个接口需要适配 - Adapter
对Adaptee的接口与Target接口进行适配
四、效果
类适配器
- 用一个具体的Adapter类对Adaptree和Target进行匹配。结果是当我们想要匹配一个类以及他的子类的时候,类Adapter不能够胜任工作
- 使得Adapter可以重新定义adaptee的部分行为,因为Adapter是Adaptee的一个子类
- 仅仅引入一个对象,并不需要二外的指针间接得到Adaptee
对象适配器
- 允许一个Adapter与多个Adaptee–Adaptee本身以及他的所有子类同时工作。Adapter可以一次给所有的Adaptee添加功能
- 使得重新定义Adaptee的行为比较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是应用Adaptee
五、实现
我们现在来看一个例子:
当我们在读书的时候都知道,有本校学生,还有寄读学生(学籍不再所就读学校)。我们想想这样一个场景。有一所高中的学生信息管理系统,由由于之前一直都是本校的学生就读,没有寄读学生。但是后来来了一部分寄读学生,这时候寄读学生信息需要从原来学校接口获取。但是寄读学生的学籍所在高校只提供Map接口,这时候是不是就陷入难题,于是就出现了适配器。
-
UML:
-
代码:
StudedntInfo接口:本校学生信息管理接口
public interface StudentInfo {
String getName();
String getAge();
String getAdress();
String getIDCard();
String getMaName();
String getFaName();
String getMaPhone();
String getFaPhone();
}
studentImp类:实现studentInfo接口
public class StudentImp implements StudentInfo{
@Override
public String getName() {
System.out.println("测试学生姓名");
return null;
}
@Override
public String getAge() {
System.out.println("测试学生年龄");
return null;
}
@Override
public String getAdress() {
System.out.println("测试学生家庭住址");
return null;
}
@Override
public String getIDCard() {
System.out.println("测试学生身份证号");
return null;
}
@Override
public String getMaName() {
System.out.println("测试学生母亲姓名");
return null;
}
@Override
public String getFaName() {
System.out.println("测试学生母亲电话");
return null;
}
@Override
public String getMaPhone() {
System.out.println("测试学生父亲姓名");
return null;
}
@Override
public String getFaPhone() {
System.out.println("测试学生父亲电话");
return null;
}
}
接口OutStudentInfo:寄读学生接口(Map类型)
public interface OutStudentInfo {
//学生个人信息
Map selfInfo();
//学生家长信息
Map parentInfo();
}
OutStudentImp:寄读学生实现类,实现OutStudentInfo接口
public class OutStudentImp implements OutStudentInfo{
@Override
public Map selfInfo() {
Map student = new HashMap();
student.put("name","测试寄读学生姓名");
student.put("age","测试寄读学生年龄");
student.put("sex","测试寄读学生性别");
student.put("adress","测试寄读学生家庭住址");
student.put("ID","测试寄读学生身份证号");
return student;
}
@Override
public Map parentInfo() {
Map parent = new HashMap();
parent.put("maName","测试寄读学生母亲姓名");
parent.put("maPhone","测试寄读学生母亲电话");
parent.put("faName","测试寄读学生父亲姓名");
parent.put("faPhone","测试寄读学生父亲电话");
return parent;
}
}
Adapter适配器:继承OutStudentImp寄读学生实现类,实现StudentInfo接口
public class Adapter extends OutStudentImp implements StudentInfo{
private Map student =super.selfInfo();
private Map parent = super.parentInfo();
@Override
public String getName() {
String name = (String) this.student.get("name");
System.out.println(name);
return name;
}
@Override
public String getAge() {
String age = (String) this.student.get("age");
System.out.println(age);
return age;
}
@Override
public String getAdress() {
String adress = (String) this.student.get("adress");
System.out.println(adress);
return adress;
}
@Override
public String getIDCard() {
String ID = (String) this.student.get("ID");
System.out.println(ID);
return ID;
}
@Override
public String getMaName() {
String name = (String) this.parent.get("maName");
System.out.println(name);
return name;
}
@Override
public String getFaName() {
String name = (String) this.parent.get("faName");
System.out.println(name);
return name;
}
@Override
public String getMaPhone() {
String phone = (String) this.parent.get("maPhone");
System.out.println(phone);
return phone;
}
@Override
public String getFaPhone() {
String phone = (String) this.parent.get("faPhone");
System.out.println(phone);
return phone;
}
}
测试:
public class Main {
public static void main (String[] args){
StudentInfo student1 = new StudentImp();
StudentInfo student2 = new Adapter();
student1.getName();
student1.getAdress();
student1.getAge();
student1.getIDCard();
student1.getMaName();
student1.getMaPhone();
student1.getFaName();
student1.getFaPhone();
System.out.println("-------------------");
student2.getName();
student2.getAdress();
student2.getAge();
student2.getIDCard();
student2.getMaName();
student2.getMaPhone();
student2.getFaName();
student2.getFaPhone();
}
}
结果:
❤️往期redis内容:可在博客中直接查看❤️
设计模式:Factory method(工厂模式)–创建型模式
设计模式:Factory method(工厂模式)–创建型模式
设计模式:Builder(生成器)–创建型模式
小白学设计模式–单例模式(singleton)
Redis进阶:主从复制–小白的进阶教程(理论:一文搞懂主从复制)
❤️ 如有错误欢迎指出❤️
❤️ 点击访问更多个人博客 www.wslhome.top❤️
❤️每天进步一点点 ❤️