前言
最近在学习到适配器模式,一些优秀的框架中也用到了适配器模式,比如SpringMvc中通过处理器映射器(HandlerMapper)来找到对应的Handler(Controller),并执行Controller中相应的方法并返回ModelAndView,下面一起看下适配器模式吧。
正文
适配器模式的出现
假设有一个软件系统,你希望它能和一个新的厂商类库搭配使用,但是这个新厂商搜设计出来的接口,不同于旧厂商的接口:
现在既不想改变现有的代码,而且也不能改变厂商的代码,这时候可以写一个类,将新厂商的接口转换成你所期望的接口。
这个适配器工作起来就如同一个中间人,它将客户所发出的请求转换成厂商类能理解的请求。
综上所述,当系统需要使用现有的类,但是这些现有类的接口不符合系统的需要,在短时间内双方都不太容易修改的时候,适配器就是为解决这种问题而产生的。
适配器模式(Adapter)的定义
适配器模式(Adapter) ,将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式的UML图
适配器模式的Demo(对象适配器通过组合来实现适配)
/**************鸭子的接口(Target)*****************/
package Adapter;
/**
* Created by zhang on 2018/9/14.
* DESCRIPTION 鸭子的接口
*/
public interface Duck {
//鸭子呱呱叫
public void quack();
//鸭子可以飞
public void fly();
}
/**************鸭子的实现*****************/
package Adapter;
/**
* Created by zhang on 2018/9/14.
* DESCRIPTION 绿头鸭 是鸭子的子类
*/
public class MallardDuck implements Duck {
public void quack() {
System.out.println("Quack");
}
public void fly() {
System.out.println("I'm flying");
}
}
/**************火鸡的接口*****************/
package Adapter;
/**
* Created by zhang on 2018/9/14.
* DESCRIPTION 火鸡的接口
*/
public interface Turkey {
//火鸡咕咕叫
public void gobble();
//火鸡可以飞
public void fly();
}
/**************火鸡的实现(Adaptee,需要适配的类)*****************/
package Adapter;
/**
* Created by zhang on 2018/9/14.
* DESCRIPTION 火鸡的实现
*/
public class WildTurkey implements Turkey{
public void gobble() {
System.out.println("Gobble gobble");
}
public void fly() {
System.out.println("i'm flying a short distance");
}
}
/**************火鸡适配器(Adapter)*****************/
package Adapter;
/**
* Created by zhang on 2018/9/14.
* DESCRIPTION 火鸡的适配器,用火鸡来冒充鸭子
*/
//实现客户想要看到的接口
public class TurkeyAdapter implements Duck{
Turkey turkey;
//取得要适配的对象引用,这里使用构造器获得引用
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
//实际调用的是火鸡的叫的方法
public void quack() {
turkey.gobble();
}
//实际调用的是火鸡的飞的方法
public void fly() {
turkey.fly();
}
}
/**************测试类*****************/
package Adapter;
/**
* Created by zhang on 2018/9/14.
* DESCRIPTION 适配器测试类
*/
public class Test {
public static void main(String[] args) {
WildTurkey turkey = new WildTurkey();
//火鸡转鸭子,客户端需要的是鸭子
Duck turkryAdapter = new TurkeyAdapter(turkey);
turkryAdapter.fly();
turkryAdapter.quack();
}
}
适配器模式的使用场景
- 想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接访问,这时创建一个适配器就能间接地去访问这个类的方法。
- 我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其它没有提供合适接口的类。
适配器模式的应用
- java.io中IO中的InputStream和InputStreamReader之间,outputStream和outputStreamReader之间,InputStreamReader和outputStreamReader (二者都是转换流)用于将字节流转换成字符流。
- SpringMvc 中定义了一个适配接口,每一种Controller 有一种对应的适配器实现类,让适配器代替Controller 执行相应的方法,这样在扩展Controll的时候,只需要增加一个适配器就完成了SpringMVC的扩展了。
- 具体应用详见下篇博客。
总结
适配器的学习就到这里,感谢您的耐心阅读,下篇博客将为您介绍具体适配器在IO 和SpringMVC的具体应用。