适配器设计模式的角色
1、目标接口:当前业务所期待的接口,可以是抽象类或接口
2、适配者,它是被访问和适配的现存组件库中的组件接口
3、适配器,相当于一个转换器,通过过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
通过一个例子谈谈适配器模式吧
1、我们先定义一个小学生守则接口 , 所有的小学生都必须遵守
//学生守则接口
public interface StudentNorm {
//考试后家长签字
public void doSome();
//一周看一次免费电影
public void doOther();
}
2、接着我们创建一个小学生类实现这个接口
public class Student implements studentNorm{
//显然在这里我们必须重写接口中的所有方法
doSome(){
...
}
doOther(){
...
}
}
那么我们现在把自己想成小学生。 我们只想没周看一次免费电影 , 不想考试后给家长签字, 怎么办 。
这个时候我们的适配者就出场 。 我们的小学生走在路上碰到一个小商贩 , 灵机一动 , 喊了一身 “爸爸”
这个时候 “爸爸”(小商贩)见儿子(小学生)有难不能不帮啊,怎么帮呢?
//小商贩类
public class person implements StudentNorm{
//显然小商贩事先学生守则接口后也需要重写接口中的所有方法。但是此时小学生如果继承person还是需要重写父类中的所有方法。
doSome(){
...
}
doOther(){
...
}
}
这里我们的适配器设计模式就出现了
public abstract class preson implements StudentNorm {
@Override
public void doSome() {
System.out.println("开始后家长签字,实际签的是老爸");
}
}
将我们的适配者也就是小商贩定义为抽象类,此时abstract修饰的类可以选择性的重写实现接口中的方法 …此时我们的小学生来继承person
//此时如果小学生实现了StudentNorm 则必须实现该接口中所有的方法
//那么如果现在只是让下学生一周看一次免费电影 而不用考试后家长签字 所以此时需要
//一个 ”中间人“ 这个人既可以帮助我们选择我们需要的功能也可以帮助我们避免我们需要实现的功能
public class Student extends preson{
@Override
public void doOther() {
System.out.println("小学生一周可以看一次免费电影, 实际看的是儿子");
}
}
test:
public class TestMain {
public static void main(String[] args) {
StudentNorm mike = new Student();
mike.doSome();
mike.doOther();
}
}
通过这里例子很清晰的说明当我们的目标类 , 需要添加某个功能或者方法的时候,而我们的此时并不是需要接口中的所有功能,此时就可以采用我们的适配器 , 定义一个适配者中间转换器来让我们的目标类继承或者实现我们的适配者 , 完成功能的添加