软件设计模式——适配器(Adapter)模式

适配器模式(Adapter Pattern):是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。该类负责加入独立的或不兼容的接口功能。将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

何时使用:
1、系统需要使用现有的类,而此类的接口不符合系统的需要。
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

类的适配器模式


下面代码说明:
思想是:有一个 Source 类,拥有一个方法待适配。目标接口是Targetable,通过 Adapter 类,将 Source 的功能扩展到 Targetable 里。
软件设计模式——适配器(Adapter)模式_第1张图片

public class Source {
    public void method1()
    {
        System.out.println("this is original method!");
    }
}
public interface Targetable {
//与原类中的方法相同
    public void method1();
//新类的方法
    public void method2();
}
//Adapter类继承了Source类,实现了Targetable接口
public class Adapter extends Source implements Targetable {
    @Override
    public void method2() {
        System.out.println("this is the targetable method!");
    }
}
public class AdapterTest {
    public static void main(String[] args)
    {
        Targetable target=new Adapter();
        target.method1();
        target.method2();
    }
}

结果为:
this is original method!
this is the targetable method!

对象的适配器模式


基本思路和类的适配器模式相同,只是将Adapter类作修改,这次不继承Source类,而是持有Source类的实例,以达到解决兼容性的问题.
软件设计模式——适配器(Adapter)模式_第2张图片

public class Source {
    public void method1()
    {
        System.out.println("this is original method!");
    }
}
public class Wrapper implements Targetable{

    private Source source;
    public Wrapper(Source source) {
        super();
        this.source = source;
    }
    @Override
    public void method1() {
        source.method1();
    }

    @Override
    public void method2() {
        System.out.println("this is targetable method!");

    }
}
public interface Targetable {
//与原类中的方法相同
    public void method1();
//新类的方法
    public void method2();
}
public class AdapterTest {
    public static void main(String[] args)
    {
        Source source = new Source();
        Targetable target=new Wrapper(source);
        target.method1();
        target.method2();
    }
}

输出结果:
this is original method!
this is targetable method!

接口的适配器模式


接口的适配器是这样的:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。
看一下类图:
软件设计模式——适配器(Adapter)模式_第3张图片

public interface Sourceable {
    public void method1();
    public void method2();
}
public abstract class Wrapper2 implements Sourceable {
    public void method1(){}
    public void method2(){}
}
public class SourceSub1 extends Wrapper2{
    public void method1(){
        System.out.println("the sourceable interface's first Sub1!");
    }
}
public class SourceSub2 extends Wrapper2{
    public void method2(){
        System.out.println("the sourceable interface's second Sub2!");
    }
}
public class WrapperTest {
    public static void main(String[] args)
    {
        Sourceable source1=new SourceSub1();
        Sourceable soource2=new SourceSub2();

        source1.method1();
        source1.method2();

        soource2.method1();
        soource2.method2();
    }
}

输出结果:
the sourceable interface’s first Sub1!
the sourceable interface’s second Sub2!

三种模式的总结:

类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。

接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。

你可能感兴趣的:(软件设计模式)