设计模式(三):适配器模式
之前写了两篇,反思了下怎么才算真正理解设计模式,觉得只要可以举个例子让大家明白,就算真正理解了,所以设计模式离不开场景,这里就给大家举个形象的例子,帮助大家理解适配器模式。
目录
类适配器
场景介绍
首先先介绍下自己,Java技能包括基础和web,我学的是java,所以实现了该接口
public interface Java {
void base();
void web();
}
public class Myself implements Java{
@Override
public void base() {
System.out.println("我会java基础");
}
@Override
public void web() {
System.out.println("我会javaWeb");
}
}
现在有项工作,他的技能要求除了Java还要求会点大数据。
public interface Job extends Java{
void bigData();
}
怎么办喃,为了生存只能去适应工作嘛,现在创造一个适配器类,让我可以适应新的工作
public class JobAdapter extends Myself implements Job{
@Override
public void bigData() {
System.out.println("我也会大数据了");
}
}
测试下
public class TestAdapter {
public static void main(String[] args) {
Job ww = new JobAdapter();
TestAdapter.doWork(ww);
}
public static void doWork(Job job){
job.base();
}
}
总结
类适配器就是把原有的Source类对象(比如Myself是实现了Java接口),转换成一个新的目标类型(Job)。
创建的新适配器类,继承了原有的类(Myself),同时实现了目标接口(Job)。
使用场景
系统需要使用现有的类(Myself),但是现有的类不完全符合需要(不会大数据啊),但是又不想重新实现目标接口的所有方法(不愿意重新招一个既会Java又会大数据的新人,毕竟我只要学会大数据就可以完成工作了,成本小一点)。
对象适配器
所谓对象适配器,就是指适配器拥有source对象的引用。
场景介绍
比如现在组内还有别的小伙伴Kevin也要开始做这项工作了
public class Kevin implements Java{
@Override
public void base() {
System.out.println("kevin 会java基础");
}
@Override
public void web() {
System.out.println("kevin 会javaWeb");
}
}
然后我们要针对Kevin开发一个新的适配器类
public class KevinJobAdapter extends Kevin implements Job{
@Override
public void bigData() {
System.out.println("Kevin 也会大数据了");
}
}
现在遇到问题了,组内还有七八个小伙伴要加入这项工作岂不是需要创建七八个对应的适配器类,所以这种情形就需要创建对象适配器了
public class JavaJobAdapter implements Job{
private Java java;
public JavaJobAdapter(Java java) {
this.java = java;
}
@Override
public void bigData() {
}
@Override
public void base() {
java.base();
}
@Override
public void web() {
java.web();
}
}
这样一个对象适配器就可以解决组内对象的适配工作了
public class TestObjAdapter {
public static void main(String[] args) {
//类适配器
Job my = new MyselfJobAdapter();
TestAdapter.doWork(my);
Job kevin = new KevinJobAdapter();
TestAdapter.doWork(kevin);
//对象适配器
Job my2 = new JavaJobAdapter(new Myself());
Job kevin2 = new JavaJobAdapter(new Kevin());
}
public static void doWork(Job job){
job.base();
}
}
总结
对象适配器可以通过拥有某种类型对象的引用达到适配同种类型的多个对象的功能,也可以作为抽象适配器,然后