设计模式
结构性模式
从程序的结构上实现送耦合,从而可以扩大整体的类结构,用来解决更大的问题。
适配器模式
将一个类的接口转换成客户希望的另外一个接口,适配器模式是的原本由于接口不兼容而不能一起工作的那些类可以一起工作!
例子
有一台电脑,但是不能直接插网线,需要一个转换器才能够连接上网线上网。用java语言来模拟这个情节。
1、网线,它就是属于我们想用但是又不能直接用的类,需要被适配的类。在本例中他需要被转换器适配一下。
// 本例中的网线,应为它需要被被人使用,但是我们有没有办法直接来使用它。
// 所以需要把它进行一下适配让它成为我们想要的(能够使用的类),这个网线类就是要被适配的类。
// 我们就需要一个适配器来适配它。
public class Adapter {
public void request() {
System.out.println("连接网线上网");
}
}
2、我们采用面向接口编程
这个是转换器(适配器)的接口
// 我们的适配器接口(把适配器抽象出一个接口)
// 接口转换器的抽象实现
public interface NetUsb {
// 处理请求, 把网线插到电脑上
public void handleRequest();
}
适配器的实现类(类适配器)
// 第一种的类适配器,是通过继承的方式来实现适配的,但是java只能单继承,所以这样的方式存在一定的问题的
public class Adaptee extends Adapter implements NetUsb {
// Adapter有网线
@Override
public void handleRequest() {
super.request(); // 可以上网了
}
}
适配器的实现类(对象适配器)
// 这是一个对象适配器
// 直接把需要适配的类,适配进来,按照这种模式,可以适配很多种的适配者,在实际的开发中广泛的使用
public class Adaptee2 implements NetUsb {
private Adapter adapter;
public Adaptee2(Adapter adapter) {
this.adapter = adapter;
}
public void handleRequest() {
adapter.request();
}
}
3、电脑,这里就是使用者类,它想调用网线来上网,但是需要转换线来适配
// 客户端类,想上网, 插不上网线
public class Computer {
public void net(NetUsb adapter) {
// 上网的具体实现, 需要一个转接头
adapter.handleRequest();
// 调用的是接口的方法, 实际上是它的实现类在起作用。
}
public static void main(String[] args) {
Computer computer = new Computer(); // 电脑
Adapter adapter = new Adapter(); // 网线, 需要被适配的类
Adaptee adaptee1 = new Adaptee(); // 转换器, 适配器
Adaptee2 adaptee2 = new Adaptee2(adapter); // 转换器
computer.net(adaptee2);
}
}
角色分析
目标接口:客户所期待的接口,目标可是具体的或者抽象的类,也可以是接口
需要适配的类:需要适配的类或者适配者类
适配器:通过包装一个需要适配的对象,把原来的接口转换成目标对象。
适配器
对象适配器:一个对象适配器可以把多个不同的适配者适配到同一个目标,也可以适配一个适配者的子类。
类适配器:不支持多重类继承
实际中的例子
springmvc 中的处理器适配器、处理器映射器、Java GUI中的适配器。
观看狂神说java的视频笔记