废话一下
上一篇我们说到装饰者模式,通过 装饰者模式我们可以增强/消弱类的功能或做一些额外的处理。如果我想直接修改类的实现呢?(装饰者模式只是添加额外的处理,原实现仍然保留),今天我们来看一下适配器模式
适配器模式
1、定义:
将一个类的接口变换成客户端所期待的另外一种接口,从而使原本因进口不兼容而无妨一起工作的两个类能够在一起工作
怎么来理解它呢?就是说,我想把一个类的实现转化成另外一个类。举个例子,现在有Course类
public class Course {
private String courseName;
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCourseName() {
return courseName;
}
}
有一个Teacher类
public class Teacher {
private String teacherName;
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
}
大家看到这是完全没有关系的两个类,但是我想让他们有联系,我想他们能够在一起工作。首先,我们确定一下转化方向,这里我将course转化成teacher,那么我们开始操作
1、定义一个ITeacher接口
public interface ITeacher {
void getTeacherName();
}
2、Teacher实现这个接口
public class Teacher implements ITeacher{
private String teacherName;
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
//注意这里的getTeacherName不是 get/set方法,
@Override
public String getTeacherName() {
return teacherName;
}
}
3、我们既然要转化。首先要想办法将他们混为一谈,我们来定义一个设配器类叫CourseAdapter,我们来分析下怎样将他们转化:
a.首先要将course转换成teacher,要实现ITeacher接口/或者继承Teacher(不推荐使用继承)
b.要获取course的信息,我们要有course对象,也就是说courseAdapter要有一个course成员或者继承Course
public class CourseAdapter implements ITeacher {
private Course course;
public void setCourse(Course course) {
this.course = course;
}
@Override
public String getTeacherName() {
//这里 我们将getTeacher的真正实现转到了course
return course.getCourseName();
}
}
4、我们来看下测试类
public class Test {
public static void main(String[] args){
Course course=new Course();
course.setCourseName("课程名称");
CourseAdapter courseAdapter=new CourseAdapter();
courseAdapter.setCourse(course);
courseAdapter.getTeacherName();
}
}
5、看到这里可能会有人问这跟装饰者模式有什么关系呢?
装饰者模式中的装饰者与适配器中的适配器角色相当,都是代理了一个类,他们的区别在于装饰者模式代理的是本类型附加一些额外的操作,适配器模式中的适配器代理的不是本类型,他将执行转交给了其他类。这也正是适配器模式能够完成适配的原因所在
小结
不知道大家注意到了没?我们很多时候只要小小改动一个元素,设计模式之间就发生了转变,它适应的场景也就随之变化。现在,我们来一起将前面几章的转化了理一遍,加深一下印象:
a、策略模式 策略管理类 持有策略接口对象,操作交给策略对象来执行,它的关注点是 策略对象之间可以相互切换
b、代理模式 代理类 持有被代理类的对象(这个对象可以在内部进行初始化,也可以在其他地方初始化,只不过被代理对象是不安全的、可随意更改的,就违背了代理模式的初衷),操作交给被代理者来执行,它的关注点在于对被代理者的保护
c、实际,如果我们不让设计模式先入为主的话,策略模式何尝不是一种代理呢?只是彼此的关注点不同
d、装饰者模式 装饰者在调用被装饰者来执行操作前后插入一些行为,它的关注点在于增强/消弱被代理类的功能
e、适配器模式 将两个类进行转化,使之可以以同样的方式来工作,它的关注点是转移类的行为
f、实际上,设计模式一定要有一个比较明确的写法吗?我认为这只是一种思想。这可以从策略和代理模式的写法差别中看出,难道我在策略管理类中来实现策略对象接口我就不能实现策略模式了吗?所以这里重要的是思想。
g、后面几章看起来可能慢慢复杂起来,因为我们到目前为止,我们的代码结构还是比较简单的,基本都是具体依赖抽象,那么如果我们让抽象依赖抽象呢? 会变成什么样了呢?