不学无数——适配器模式

适配器模式

智者千虑必有一失,愚者千虑必有一得html

在咱们开发过程当中也会常常碰到一些给原有的系统加一些功能,因此无论前期咱们呢可行性、需求分析和系统设计处理的多好,随着时间的推移,总会出一些“意外”。所以咱们该如何处理掉这些“意外”呢?聪明的程序员们就想到了许多的补救模式,其中适配器模式就是补救模式中的一种。这种模式能够可以让你从由于业务的快速迭代而引起代码改变的烦恼中解脱出来。程序员

适配模式的定义

将一个类的接口变换成客户端所期待的另外一种接口,从而使本来由于接口不匹配而没法在一块儿工做的两个类可以一块儿工做设计模式

适配器模式有三个角色bash

  • Source:须要被适配的接口或者对象,你想把谁转换成目标角色,那么这个“谁”就是Source角色
  • Target:须要获得的接口或者对象,即适配完Source获得的接口或者对象,咱们所指望的接口
  • Adapter:适配器,协调Source和Target使两个可以一块儿工做。经过继承或者是类关联的方式

继承适配器

适配器模式有两种体现形式,一种是经过继承来表现,一种是经过关联对象来表现,下面给演示下继承表现的适配器。ide

适配器模式类图

下面咱们写一个简单的适配器模式的例子,以下所示ui

Target接口代码spa

interface Target{
    public void request();
}

复制代码

实现了Target接口的类设计

class RealTarget implements Target{
    @Override
    public void request() {
        System.out.println("I am Target");
    }
}

复制代码

Source源目标类code

class Source{
    public void doSomething(){
        System.out.println("I am Source");
    }
}

复制代码

接下来核心的角色要出现了就是Adaptercdn

class Adapter extends Source implements Target{
    @Override
    public void request() {
        super.doSomething();
    }
}

复制代码

接下来咱们能够进行调用试试

public class AdapterTest {
    public static void main(String[] args) {
        Target target = new RealTarget();
        target.request();
        Target target2 = new Adapter();
        target2.request();
    }
}

复制代码

打印以下

I am Target
I am Source
复制代码

对象适配器

咱们上面使用的是经过继承来使用适配器模式,还有一种作法就是将原有的继承关系变动为关联关系就能够了。

对象适配器和类适配器的区别在于:类适配器是经过继承来表现的,而对象适配器是对象的合成关系,也能够说是类的关联关系,这是二者的根本区别。两个都会在项目中用到,因为对象适配器是经过类间的关联关系进行耦合的,所以在设计的时候就比较灵活。而类适配器只能经过覆写源角色的方法进行扩展。所以在实际项目中,对象适配器的使用场景比较多。

咱们仍是先来看一下对象适配器的类图以下

对象适配器类图

而后写一个通用的例子

如今接口Target

interface Target2{
    public void printSource1();
    public void printSource2();
}

复制代码

而后有Adapter

class Adapter implements Target{

    private Source1 source1;
    private Source2 source2;

    public Adapter(){
        source1 = new Source1();
        source2 = new Source2();
    }

    @Override
    public void printSource1() {
        source1.print();
    }

    @Override
    public void printSource2() {
        source2.print();
    }

}

复制代码

而后两个Source

class Source1{
    public void print(){
        System.out.println("I am Source1");
    }
}

class Source2{
    public void print(){
        System.out.println("I am Source2");
    }
}

复制代码

而后进行调用以下

public static void main(String[] args) {
    Target2 target2 = new Adapter2();
    target2.printSource1();
    target2.printSource2();
}
复制代码

打印以下

I am Source1
I am Source2
复制代码

这样在之后增长了需求之后,只须要从新写适配器便可,上层代码不用动。

适配器的优势

  • 适配器模式可让两个没有任何关系的类在一块儿运行,只要适配器这个角色便可。
  • 增长了类的透明性:咱们访问的是Target目标角色,可是具体的实现都是委托给了源角色,而这些对高层次的模块是透明的,也是它不须要关心的。
  • 提升了类的复用:源角色在原有的系统中仍是可以继续使用,而在目标角色中也能够充当新的角色。
  • 灵活性好:若是某一天忽然一个适配器不须要了,那么只要删除便可,基本上就相似于一个灵活的构件,想用就用。

适配器模式的使用场景

适配器应用的场景只须要记住一点就够了:当你有动机修改一个已经投产中的接口时,适配器模式是最适合你的模式。好比系统扩展了,须要使用一个已有或者是新建的类,可是这个类又不符合系统的接口,怎么办?这时候就可使用适配器模式。

参考文章

相关文章
相关标签/搜索