• 设计模式(13)适配器模式


    一、介绍:

    1、定义:是一种结构型设计模式,它可以将一个类的接口转换成客户端所期望的另一种接口。适配器模式常用于系统的不兼容性问题。

    2、组成:

    (1)目标接口(Target):客户端所期望的接口,适配器通过实现目标接口来对外提供服务。

    (2)适配器(Adapter):将源接口转换成目标接口的类,它实现了目标接口,并且包含一个对源接口的引用。

    (3)源接口(Adaptee):需要被适配的类,其接口与目标接口不兼容。

    3、UML类图:

    4、优缺点:

    (1)优点:

    更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
    更好的扩展性:在实现适配器功能的时候,可以扩展自己源的行为(增加方法),从而自然地扩展系统的功能。
    完美实现解耦,通过增加适配器类将适配者与目标接口联系起来,无需修改原有实现;
    符合开闭原则

    (2)缺点:会导致系统紊乱:滥用适配器,会让系统变得非常零乱。例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

    5、适配器模式有2种:面向类的适配器模式,面向对象的适配器模式。常说的是对象适配器。

    二、demo:

    1、类适配器模式:

    1. //源:
    2. class Person {
    3. public void speakJapanese() {
    4. System.out.println("I can speak Japanese!");
    5. }
    6. public void speakEnglish() {
    7. System.out.println("I can speak English!");
    8. }
    9. }
    10. //目标:
    11. interface Target {
    12. void speakJapanese();
    13. void speakEnglish();
    14. void speakFrench();
    15. }
    16. //适配器:
    17. class Adapter extends Person implements Target {
    18. @Override
    19. public void speakFrench() {
    20. }
    21. }

    2、对象适配器模式:把“源”作为一个对象聚合到适配器类中。

    1. //源
    2. class Person {
    3. public void speakJapanese() {
    4. System.out.println("I can speak Japanese!");
    5. }
    6. public void speakEnglish() {
    7. System.out.println("I can speak English!");
    8. }
    9. }
    10. //对象
    11. interface Target {
    12. void speakJapanese();
    13. void speakEnglish();
    14. void speakFrench();
    15. }
    16. //适配器
    17. class Adapter implements Target {
    18. Person mPerson;
    19. public Adapter(Person person) {
    20. this.mPerson = person;
    21. }
    22. @Override
    23. public void speakJapanese() {
    24. mPerson.speakJapanese();
    25. }
    26. @Override
    27. public void speakEnglish() {
    28. mPerson.speakEnglish();
    29. }
    30. @Override
    31. public void speakFrench() {
    32. }
    33. }

    3、接口适配器模式(缺省适配模式):

    这种模式的核心归结如下:当你想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法时,就用默认的适配器模式,他的方法是在接口和具体实现类中添加一个抽象类,而用抽象类去空实现目标接口的所有方法。而具体的实现类只需要覆盖其需要完成的方法即可。

    1. public interface Job {
    2. public abstract void speakJapanese();
    3. public abstract void speakEnglish();
    4. public abstract void speakFrench();
    5. public abstract void speakChinese();
    6. }
    7. public abstract class JobDefault implements Job{
    8. public void speakChinese() {
    9. }
    10. public void speakEnglish() {
    11. }
    12. public void speakFrench() {
    13. }
    14. public void speakJapanese() {
    15. }
    16. }
    17. public class JobImpl extends JobDefault{
    18. public void speakChinese(){
    19. System.out.println("I can speak Chinese!");
    20. }
    21. }

  • 相关阅读:
    Python——email模块
    React 状态管理 - Mobx 入门(下)接入实战
    tns-12545 tns-12560 tns00515 linux error 99
    SpringCloud-Hystrix
    QCC51XX---提示音和LED状态分析
    Spring源码分析(三) bean的生命周期 getBean()和doGetBean()
    16-JavaSE基础巩固项目:拼图小游戏
    数据结构与算法——单链表的基本操作的实现
    车载通信架构 —— SOME/IP-SD 协议介绍
    深入剖析 Python 最常用数据结构:列表(List) & 元组(Tuple)
  • 原文地址:https://blog.csdn.net/w_t_y_y/article/details/134010731