适配器模式
定义
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原
本由于接口不兼容而不能一起工作的那些类可以在一起工作。
和生活场景中的插头转接器有点像
模式中的角色
目标接口(Target) :客户所期待的接口,目标可以是具体的或者抽象的类,也可以是接口
需要的适配类(Adaptee):需要适配的类或者适配者类
适配器(Adapter):通过包装一个需要适配的对象,把原接口转变成目标接口
package com.xiaoqiang.gof23.structureModel.adapter;
/**
* @author xiaoqiang
目标接口 两个的插座
*/
public interface Target {
void handleReq();
}
package com.xiaoqiang.gof23.structureModel.adapter;
/**
* @author xiaoqiang
*
* 被适配的类 相当于 三个的插座
*/
public class Adaptee {
public void request() {
System.out.println("可以完成客户需要的功能!");
}
}
package com.xiaoqiang.gof23.structureModel.adapter;
/**
* @author xiaoqiang
*
* 适配器本身
*
* 相当于转接口
*先实现目标的接口(两个的插座)
* 两种方式
* 1:继承被适配类(三个的插座) 然后通过 super.request(); 实现其(三个插座)的功能
* 不过灵活,只能单继承,实现一种
* 2:组合被适配的类
* 需要自己提供 Adaptee
*/
public class Adapter implements Target {
private Adaptee adaptee;
@Override
public void handleReq() {
adaptee.request();
}
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
}
package com.xiaoqiang.gof23.structureModel.adapter;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
* 客户类
*
* 相当于笔记本
*/
public class Client {
public static void main(String[] args) {
// 调用方法
Adaptee adaptee = new Adaptee();
// 用适配器将 Adaptee 变成了目标需要的 Target
Target target = new Adapter(adaptee);
// 调用目标需要的方法
target.handleReq();
// 或者这样
new Adapter(new Adaptee()).handleReq();
}
}
场景:经常用来做旧系统改造和升级
– 如果我们的系统开发之后再也不需要维护,那么很多模式都是没必要
的,但是不幸的是,事实却是维护一个系统的代价往往是开发一个系
统的数倍。
输入输出流就是标准的适配器模式
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)