<<大话设计模式>>之适配器模式

设计模式:设计出那些可以反复使用,行之有效的代码的总结。
首先说第一个分支,接口型模式

何为接口型模式:
一个类的实例instaceA想使用另一个类其实例instanceX的服务service。但是前提是不清楚该类的名字。
这时,可以把服务service抽象为一个接口,然后instaceA持有该接口的实例,来使用服务service。
通过接口间接的获取服务,这种解决方法就称为接口型模式。

接口型模式分为:
适配器模式,外观模式,组合模式,桥接模式

这一篇的内容就是讲适配器模式。
写之前看过很多写适配器模式的文章,看的我是晕晕乎乎,本来作为第一个学习的设计模式,就难为的我不行不行的。真是蛋疼。

它的完整的定义:
把一个类的接口转化为客户端需要的接口,使原本不匹配的两个类能在一起工作。

Target:客户端需要实现的接口
Adaptee:被适配的类,它实现的接口不是客户端所希冀的
Adapter:适配器,将Adaptee的接口转化为Target接口
Client:客户端,它只负责使用适配器

需求:客户端Client需要读取文件

public interface Target{//客户端期待的接口
    void readMyFile();
}

被适配的类本就有读取文件的功能,但是它实现的接口和客户端期待的接口不一致。

public class Adaptee implements FileReader{
    public void readFile(){
        System.out.println("读取文件");
    }
}

interface FileReader{
    void readFile();
}

适配器实现目标接口,继承被适配类。

public class Adapter extends Adaptee implements Target{
    @Override
    public void readMyFile() {
        this.readFile();
    }
}

客户端通过适配器,完成读文件的操作。

public class Client {
    public static void main(String[] args) {
        Adapter adapter=new Adapter();
        adapter.readMyFile();
    }
}

其实写完上面的内容,我是困惑的。
难道客户端需要的接口和被适配类的接口,方法不一致,即使功能差不多。也要搞一个适配器吗?
接口名,方法名写的和目标接口一致不就得了。当然这个大前提是,程序员的命名要规范。
只要规范,功能差不太多的情况,压根不需要写一个适配器模式。
但如果目标的接口和被适配的接口都不太好修改,最好的办法那就是适配器模式。

还有一种情况,使用第三方的类。第三方的类的接口和目标接口有差异,就不需要迎合第三方类的接口。那么也就需要适配器模式。

其实也可以这样理解:Adaptee有实现的功能,但是怎么和Target建立关系呢?
这时通过Adapter来实现Target接口,继承Adaptee。那么就可以在Target的实现方法中,调用Adaptee有实现的方法。通过这样就可以建立联系。
这或许就是适配器模式的精髓把。

适配器模式分为:类适配器+对象适配器

上面的Adapter适配器类有两个特点:
实现Target目标接口,然后通过继承来使用Adaptee(或者叫做重用Adaptee)。这种适配方式称为类适配器。

而Adapter适配器还可以有一种写法:

public class Adapter implements Target{
    private Adaptee adaptee=new Adaptee();

    @Override
    public void readMyFile() {
        adaptee.readFile();
    }
}

实现目标接口,在适配器中获取Adaptee实例。这种称为对象适配器。

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