1. 分类
- 结构型模式
- 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题
- 分类:
- 适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式
2. 简介
- 什么是适配器模式?
- 将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作
- 模式中的角色
- 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
- 需要适配的类(Adaptee):需要适配的类或适配者类。
- 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
3. 代码测试
3.1 类适配器
创建被适配的类
/**
* 被适配的类
*/
public class Adaptee {
public void request() {
System.out.println("Adaptee.request()");
}
}
创建Target
接口
public interface Target {
void handleRequest();
}
创建适配器
/**
* 适配器(通过继承的方式) 类适配器
*/
public class Adapter extends Adaptee implements Target {
@Override
public void handleRequest() {
super.request();
}
}
这里是通过继承Adaptee
的方式实现适配,所以叫类适配器,缺点就是java只能单继承,一旦继承了Adaptee
就无法继承其他的类。
测试
/**
* 调用者
*/
public class Client {
/**
* 测试方法
*/
public void test(Target t) {
t.handleRequest();
}
public static void main(String[] args) {
// 客户端
Client client = new Client();
Target target = new Adapter();
// 客户端调用Adaptee的request方法
client.test(target);
}
}
test(Target t)
方法只接受Target类型的参数却要调用Adaptee
类的方法,通过Adapter
适配器成功调用
控制台打印:
Adaptee.request()
3.2 对象适配器
/**
* 适配器(使用了组合的方式跟被适配对象整合) 对象适配器
*/
public class Adapter2 implements Target {
private Adaptee adaptee;
@Override
public void handleRequest() {
adaptee.request();
}
public Adapter2(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
}
不使用继承方式,让两者组合,达到效果
测试
/**
* 调用者
*/
public class Client {
/**
* 测试方法
*/
public void test(Target t) {
t.handleRequest();
}
public static void main(String[] args) {
// 客户端
Client client = new Client();
Adaptee adaptee = new Adaptee();
Target target = new Adapter2(adaptee);
// 客户端调用Adaptee的request方法
client.test(target);
}
}
控制台打印
Adaptee.request()
- 工作中的场景
- 经常用来做旧系统改造和升级
- 如果我们的系统开发之后再也不需要维护,那么很多模式都是没有必要的,但是不幸的是,事实却是维护一个系统的代价往往是开发一个系统的数倍。
- 我们学习中见过的场景
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)