适配器模式也是结构型模式的一种。
结构型模式的核心作用是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。
结构型模式的分类有:
1.适配器模式,代理模式,桥接模式;
2.装饰模式,组合模式,外观模式,享元模式;
适配器模式可以将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
适配器模式中的角色有:
1.目标接口(Traget):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
2.需要适配的类(Adaptee):需要适配的类或者适配者类。
3.适配器:通过包装一个需要适配的对象,把原接口转换成目标接口。
还是用代码例子说明
1.首先创建Adaptee类,即需要被适配的对象:
public class Adaptee {
public void request(){
System.out.println("可以完成客户请求的需要的功能!");
}
}
2.创建Target类,就是给客户端调用的接口:
public interface Target {
void handleReq();
}
3.创建适配器类,负责将Adaptee适配到Target,起到了转换器的作用:
public class Adapter extends Adaptee implements Target {
@Override
public void handleReq() {
super.request();
}
}
4.客户端测试:
public class Client {
public void test1(Target t){
t.handleReq();
}
public static void main(String[] args) {
Client c = new Client();
Adaptee a = new Adaptee();
Target t = new Adapter();
c.test1(t);
}
}
但是上面这个版本的Adapter采用的是继承Adaptee的方式注入Adaptee,java中采用的是单继承,如果此时Adapter还需要继承其他类则没有办法了,不够灵活。
下面采用的是对象组合的方式,将Adaptee注入到Adapter中,更为灵活,建议用下面的方法创建Adapter:
public class Adapter2 implements Target {
private Adaptee adaptee;
@Override
public void handleReq() {
adaptee.request();
}
public Adapter2(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
}
适配器模式的使用场景:
1.用来做旧系统的改造和升级;
2.转换流就是使用的适配器模式,
java.io.InputStreamReader
java.io.OutputStream