什么是适配器模式
概念:适配器模式是指通过一个适配器的中间环节使得一个类的方法被包装为另一个类的方法。如图:
我们希望调用接口A的方法,当没有接口A提供,而只有与它相似的接口B可以使用,这时就需要使用到适配器。在工作中,可能需要维护一些比较老旧的代码,为了适应新的需求,且不去重写代码的情况下,就可以加上适配器这个中间环节,使得过时的代码满足客户的需求。适配器模式在Java中具体体现为方法的封装,令一个类实现接口B并实例化(被适配对象),再令适配器类实现接口A,在实例化适配器的时候把被适配对象传入。组织代码使得被适配对象的方法调用处于适配器的方法内部,最终实现所需要的功能,客户只是对适配器的方法进行调用,而实际调用的是被适配者的方法,客户是不知道这件事的,因为最终实现的功能和直接使用A类对象的效果是一致的。
可以理解为如下伪代码,表面上被调用的方法和实际调用的方法被适配器改变了。
A方法1(){
B方法1();
}
A方法2(){
B方法2();
}
A方法3(){
B方法3();
}
对象适配器和类适配器:
对象适配器:让接口B的子类对象被适配器(实现接口A)封装,对外提供接口A中的方法。
类适配器:把上述接口换为具体的类A和类B,其他相同。
比较分析:对象适配器的方法比较稳定,只能是接口A的方法,而类适配器可以有方法的重写。类适配器弹性好,对象适配器稳定性高,比较可靠。
写一个适配器(数组实现队列)
队列接口(明确了呈现给用户的方法):
public interface Queue <E>{
/**
* 将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。
* @return
*/
public abstract boolean add(E e);
/**
* 获取,但是不移除此队列的头。
* @return
*/
public abstract E element();
/**
* 将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。
* @param e
* @return
*/
public abstract boolean offer(E e);
/**
* 获取但不移除此队列的头;如果此队列为空,则返回 null。
* @return
*/
public abstract E peek();
/**
* 获取并移除此队列的头,如果此队列为空,则返回 null。
* @return
*/