全屏浏览
缩小浏览
回到页首

设计模式---->java的适配器模式

  适配器模式(Adapter Pattern)又叫做变压器模式,也叫做包装模式(Wrapper),但是包装模式可不止一个,还包括装饰模式。它的定义如下:Convert the interface of a class into another interface clients expect.Adapter lets classes worktogether that couldn't otherwise because of incompatible interfaces.(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。)

适配器模式的使用

通用的类图如下:

img

一、装饰模式的定义

  适配器模式在生活中还是很常见的,比如你笔记本上的电源适配器,可以使用在110~220V之间变化的电源,而笔记本还能正常工作,这也是适配器一个良好模式的体现,简单地说,适配器模式就是把一个接口或类转换成其他的接口或类,从另一方面来说,适配器模式也就是一个包装模式,为什么呢?它把Adaptee包装成一个Target接口的类,加了一层衣服,包装成另外一个靓妞了。大家知道,设计模式原是为建筑设计而服务的,软件设计模式只是借用了人家的原理而已,那我们来看看最原始的适配器是如何设计的,如图19-5所示。

  A、B两个图框代表已经塑模成型的物体A和物体B,那现在要求把A和B安装在一起使用,如何安装?两者的接口不一致,是不可能安装在一起使用的,那怎么办?引入一个物体C,如图19-6所示。

img

引入物体C后,C适应了物体A的接口,同时也适应了物体B的接口,然后三者就可以组合成一个完整的物体,如图19-7所示。

img

其中的物体C就是我们说的适配器,它在中间起到了角色转换的作用,把原有的长条形接口转换了三角形接口。在我们软件业的设计模式中,适配器模式也是相似的功能,那我们先来看看适配器模式的三个角色。

  • Target目标角色

该角色定义把其他类转换为何种接口,也就是我们的期望接口,例子中的IUserInfo接口就是目标角色。

  • Adaptee源角色

你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象,经过适配器角色的包装,它会成为一个崭新、靓丽的角色。

  • Adapter适配器角色

适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,它的职责非常简单:把源角色转换为目标角色,怎么转换?通过继承或是类关联的方式。

各个角色的职责都已经非常清楚,我们再来看看其通用源码,目标接口如代码:

public interface Target {
    //目标角色有自己的方法
    public void request();
}

目标角色是一个已经在正式运行的角色,你不可能去修改角色中的方法,你能做的就是如何去实现接口中的方法,而且通常情况下,目标角色是一个接口或者是抽象类,一般不会是实现类。一个正在服役的目标角色,如代码

public class ConcreteTarget implements Target {
    public void request() {
        System.out.println("if you need any help,pls call me!"); 
    }
}

源角色也是已经在服役状态(当然,非要新建立一个源角色,然后套用适配器模式,那也没有任何问题),它是一个正常的类,其源代码如代码

public class Adaptee {
    //原有的业务逻辑
    public void doSomething(){
        System.out.println("I'm kind of busy,leave me alone,pls!");
    }
}

我们的核心角色要出场了,适配器角色如代码

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

所有的角色都已经在场了,那我们就开始看看这场演出,场景类如代码

public class Client {
    public static void main(String[] args) {
        //原有的业务逻辑
        Target target = new ConcreteTarget();
        target.request();
        //现在增加了适配器角色后的业务逻辑
        Target target2 = new Adapter();
        target2.request();
    }
}

二、适配器模式的优点

适配器模式可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定他们就成。

  • 增加了类的透明性

想想看,我们访问的Target目标角色,但是具体的实现都委托给了源角色,而这些对高层次模块是透明的,也是它不需要关心的。

  • 提高了类的复用度

当然了,源角色在原有的系统中还是可以正常使用,而在目标角色中也可以充当新的演员。

  • 灵活性非常好

某一天,突然不想要适配器,没问题,删除掉这个适配器就可以了,其他的代码都不用修改,基本上就类似一个灵活的构件,想用就用,不想就卸载。


三、适配器模式的使用场景

  适配器应用的场景只要记住一点就足够了:你有动机修改一个已经投产中的接口时,适配器模式可能是最适合你的模式。比如系统扩展了,需要使用一个已有或新建立的类,但这个类又不符合系统的接口,怎么办?使用适配器模式,这也是我们例子中提到的。


四、适配器模式的注意事项

  适配器模式最好在详细设计阶段不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题,没有一个系统分析师会在做详细设计的时候考虑使用适配器模式,这个模式使用的主要场景是扩展应用中,就像我们上面的那个例子一样,系统扩展了,不符合原有设计的时候才考虑通过适配器模式减少代码修改带来的风险。

  再次提醒一点,项目一定要遵守依赖倒置原则和里氏替换原则,否则即使在适合使用适配器的场合下,也会带来非常大的改造。


友情链接

posted @ 2018-04-18 20:07  huhx  阅读(448)  评论(0编辑  收藏  举报