什么是适配器模式?
适配器模式是将一个接口转换成另一个接口,将原本不能兼容使用的接口变成可以使用的一种手段;适配器模式的特性有那些?
可以将原本不能用的接口,变成可用的接口;
最主要的特点就是转换器;
为什么要使用适配器模式?
主要是用来做复用,如果已经有一个很好的功能,但因为接口不同而重写这个功能那就太浪费了;
所以用适配器后可以复用一些稳定的功能;
如何使用适配器模式?
通常适配器是一个实现类,通过创建对象,将适配器创建出来,并将要适配的对象传入给适配器!适配器模式的实现原理是什么?
两步完成:
1.适配器类实现要使用的接口
2.再适配器中引用不兼容的接口类;
适配器模式的优缺点是什么?
优点:
更好的复用性
更好的扩展性
缺点:
如果适配器用的过多,会让人感觉系统很乱,不容易整体进行把握
适配器的实现结构图:
乱配器的实现代码:
电源接口:
public interface Power {
public void charging(SlowDisk slowDisk);
}
电源实现:
public class PowerImpl implements Power {
@Override
public void charging(SlowDisk slowDisk) {
slowDisk.power(true);
System.out.println("接入电源成功!");
}
}
慢速硬盘接口:
public interface SlowDisk {
public void read();
public void writer();
public void power(boolean isReady);
}
慢速硬盘实现:
public class SlowDiskImpl implements SlowDisk {
private boolean isReady;
@Override
public void read() {
check();
System.out.println("慢速读取数据");
}
private void check() {
if (!isReady) {
System.out.println("未接入电源");
System.exit(0);
}
}
@Override
public void writer() {
check();
System.out.println("慢速写入数据");
}
@Override
public void power(boolean isReady) {
this.isReady = isReady;
}
}
客户端类:
public class Client {
public static void main(String[] args) {
Power power = new PowerImpl();
SlowDisk slowDisk = new SlowDiskImpl();
//不接入电源无法使用读写功能
power.charging(slowDisk);
slowDisk.read();
slowDisk.writer();
}
}
以上的代码是一个完整的电源连接硬盘的例子;
随着技术的进步,出现了一种新的硬盘,快速硬盘,但是因为快速硬盘和慢速硬盘的类型不同,所以要使用适配器才能使用!
下面就是适配器实现的代码:
快速硬盘接口:
public interface FastDisk {
public void read();
public void writer();
public void power(boolean isReady);
}
快速硬盘实现:
public class FastDiskImpl implements FastDisk {
private boolean isReady;
@Override
public void read() {
check();
System.out.println("慢速读取数据");
}
private void check() {
if (!isReady) {
System.out.println("未接入电源");
System.exit(0);
}
}
@Override
public void writer() {
check();
System.out.println("慢速写入数据");
}
@Override
public void power(boolean isReady) {
this.isReady = isReady;
}
}
适配器类:
适配器类的两个特点:
适配器类要实现要使用的接口
适配器类要引用要转换的接口
/**
* 适配器原则:
* 实现和继承Power能支持的类型这里是SlowDisk
* 引用新的FastDisk
*
* @author ww
*
*/
public class DiskAdapter implements SlowDisk {
private FastDisk fastDisk = null;
public DiskAdapter(FastDisk fastDisk){
this.fastDisk = fastDisk;
}
@Override
public void read() {
fastDisk.read();
}
@Override
public void writer() {
fastDisk.writer();
}
@Override
public void power(boolean isReady) {
fastDisk.power(isReady);
}
}
新的客户端使用方法:
public class NewClient {
public static void main(String[] args) {
/**
* 如果使用power电源给新的FastDisk快速硬盘充电?
*
* 使用适配器,将FastDisk转换成SlowDisk接口,但使用的还是FastDisk的功能;
*/
Power power = new PowerImpl();
//因为直接无法使用电源接口,所以需要适配器转化
SlowDisk slowDisk = new DiskAdapter(new FastDiskImpl());
//power.charging(slowDisk);
slowDisk.read();
slowDisk.writer();
}
}
致此,完成了对适配器模式的代码实现!