适配器模式主要是用于补救的,为什么这么说呢,拿上一章的观察者模式来说:
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(){
        ...
    }
}