设计模式13-适配器模式

      之前的设计模式可以参考:http://blog.csdn.net/wj903829182/article/category/7068746

       这里继续前面没有总结完的设计模式,适配器模式,适配器模式的定义:将一个类的接口变换成客户端期待的另外一种接口,从而使原本不匹配的而无法在一起工作的两个类能够在一起工作。

      一 适配器模式的简单实现

       适配器模式又叫做变压器模式,也叫做包装模式(Wrapper),但是包装模式可不止一个。下面是用visio画的适配器模式的通用类图:

         

           Adapter是适配器类,实现目标接口Target继承Adaptee类。

         Target目标角色:该角色定义把其他类转换为何种接口,也就是我们的期待接口。

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

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

         清楚了各个角色的职责了,下面看源代码:

package com.jack.adapter;

/**
 * Created by jack on 2018/1/26.
 * 目标接口
 */
public interface Target {
    void request();
}
package com.jack.adapter;

/**
 * Created by jack on 2018/1/26.
 * 目标角色的实现类
 */
public class ConcreteTarget implements Target {
    @Override
    public void request() {
        System.out.println("if you need any help ,please call me.");
    }
}

package com.jack.adapter;

/**
 * Created by jack on 2018/1/26.
 * 源角色
 */
public class Adaptee {
    public void doSomething() {
        System.out.println("you can doSomething");
    }
}
package com.jack.adapter;

/**
 * Created by jack on 2018/1/26.
 */
public class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        super.doSomething();
    }
}
package com.jack.adapter;

/**
 * Created by jack on 2018/1/26.
 * 场景类
 */
public class Client {
    public static void main(String[] args) {
        //源有的业务逻辑
        Target target = new ConcreteTarget();
        target.request();
        //现在增加了适配器角色后的业务逻辑
        Target target1 = new Adapter();
        target1.request();
    }
}

       有上面的类图了,看这代码应该不难了,代码也比较简单就不多说了。

      二 适配器模式的优点       

适配器模式的优点:

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

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

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

       4,灵活性非常好,如果哪一天突然不想要适配器了,删除掉这个适配器就可以了,其他的代码都不用修改,基本上就类似一个灵活的构件,想用就用,不想就卸载掉。

三 适配器模式的使用场景

     适配器应用的场景:你有动机修改一个已经投产中的接口时,适配器模式可能是最合适的你模式。比如系统扩展了,需要使用一个已有或新建立的类,但这个类又不符合系统的接口,这时候就可以考虑使用适配器模式了。

四 适配器模式的注意事项

     适配器模式最后在详细设计阶段不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决在服役的项目问题,没有一个系统分析师会在做详细设计的时候考虑使用适配器模式,这个模式使用的主要场景是扩展应用中。再次提醒一点,项目一定要遵守依赖倒置原则和里氏替换原则,否则即使在适合使用适配器场合下,也会带来非常大的改造。

五 适配器模式的扩展

       下面的uml类图是对适配器模式的一个扩展,主要看类图:


            这里适配器模式使用的实现接口,然后依赖其他三个类,代码就不给出了,有了类图,实现起来代码还是很简单的。上面的叫做对象适配器,通过继承进行的适配,叫做类适配器。

         下面是对象适配器的通用类图:


           适配器的通用代码比较简单,把原有的继承关系变更为关联关系就可以了。对象适配器和类适配器的区别是:类适配器是类间继承,对象适配器是对象的合成关系,也可以说是类的关联关系,这是两者的根本区别。二者在实际项目中都会经常用到,由于对象适配器是通过类间的关联关系进行耦合的,因此在设计时就可以做到比较灵活。

        最佳实践:适配器模式是一个补偿模式,或者说是一个补救模式,通常用来解决接口不相容的问题,在百分之百的完美设计中不可能使用到的。适配器模式作为一种补救的措施,实现兼容。

    源码地址:

   https://github.com/wj903829182/springboot/tree/master/designpattern/src/main/java/com/jack/adapter

     欢迎加群交流:331227121



  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值