适配器模式主要是用于补救的,为什么这么说呢,拿上一章的观察者模式来说:
1、jdk中的观察者Observer,是一个接口,如果我们有一个类Male,要实现观察者的功能,那么直接实现Observer接口即可,但是,如果需要是,既要有Observer的功能,也要有User(另一个类)的功能,我们要怎么做呢?这里,类适配器就发挥作用了
public class Male extends User implement Observer{
}
只需要继承目标类,实现Observer接口,就实现了我们上述的目的,这种适配器叫做类适配器。
2、jdk中的被观察者Observable是一个类,与上面的需求类似,我们的Male类,需要有Observable被观察者的功能,又要具有User类的功能,那这怎么办?这里最好不要让User去继承Observable类,这将破环原有的继承体系。由于Java继承只允许继承一个类,我们使用类适配器将无法满足我们的需求,那么,就要使用对象适配器了。
class Male extends User{
private Observable observable;
//get set方法
}
这就是对象适配器,采用组合的模式,这样,User和Observable两个类的功能我们都可以使用了。当然,这里不是最好的方式,因为实际需求中不仅仅只有一个Male类,可能还有其他类需要有类似的需求,我们重复这样定义实在是太麻烦了,所以,我们定义一个公共的类,作为一个适配器,Male类直接继承这个公共的适配器就能够满足需求了。
class BaseUserObservable extends User{
private Observable observable;
//get set方法
}
class Male extends BaseUserObservable {
}
这样就是对象适配器了。
根据目的的不同,还可以分为 定制适配器和缺省适配器。上面所说的,是目的性很强的,需要实现什么什么功能,就是定制适配器,而缺省适配器,作用是在我们实现某些接口时,省去一些不需要的方法,比如:
interface A{
public void method1();
public void method2();
public void method2();
}
有一个接口A,有三个方法,假设,我们有个类C,需要继承A,则必须重写这三个方法,这时候,假设我们值真正使用到的只有method1,那么另外两个方法的代码就显得冗余了,这时候可以使用缺省适配器。
class B implement A{
public void method1(){}
public void method2(){}
public void method2(){}
}
那么,我们的类C,只需要继承B,然后重写我们需要的方法即可
class C extends B {
public void method1(){
...
}
}