java中设计模式之适配器模式

 更新时间:2017年09月22日 14:42:08   作者:爱宝贝丶  
这篇文章主要介绍了java中设计模式之适配器模式的相关资料,适配器模式将一个类的接口转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作得亲密无间,需要的朋友可以参考下

java中设计模式之适配器模式

 前言:

    适配器模式可以将一个类或接口应用于另一个不同但是却有联系的接口,主要的做法是通过声明一个目标接口的实现类,在该类中声明一个将被适配类或接口(被适配者)作为参数的构造器和被适配者的实例,这样在实现目标接口的时候就可以调用被适配者的实例,并且辅以一些额外的操作。适配器模式的主体有三个部分:适配者,适配者实现类和被适配者。具体类结构如下图:

      这里将被适配者的对象以组合的方式放到适配器类中,那么被适配者及其实现者都可以使用该适配器。适配器模式的优点在于可以将不同类型但是工作目的相似的对象兼容起来,而缺点在于,如果目标接口较大,那么要进行兼容工作就需要许多额外的代码。

      这里以一个不太符合实际的例子来对适配器模式进行说明。火鸡和鸭子都是可以叫并且飞的,但是火鸡和鸭子的叫声不一样,并且火鸡也没有鸭子飞得远。如果想把一只火鸡假扮为一只鸭子,就需要将火鸡对象进行一些装扮,这里我们就可以声明一个装扮类,该装扮类也是鸭子类型的一种,当火鸡进入该装扮之后就变成了一只鸭子。具体的类实现如下:

目标接口(鸭子接口):

public interface Duck {
  void quack();
  void fly();
}

目标接口的正常实现(鸭子实现):

public class MallardDuck implements Duck {
  @Override
  public void quack() {
    System.out.println("Quack");
  }

  @Override
  public void fly() {
    System.out.println("I'm flying");
  }
}

被适配者接口(火鸡接口):

public interface Turkey {
  void gobble();
  void fly();
}

被适配者一般实现(火鸡类):

public class WildTurkey implements Turkey {
  @Override
  public void gobble() {
    System.out.println("Gobble gobble");
  }

  @Override
  public void fly() {
    System.out.println("I'm flying a short distance");
  }
}

适配器:

public class TurkeyAdapter implements Duck {
  private Turkey turkey;

  public TurkeyAdapter(Turkey turkey) {
    this.turkey = turkey;
  }

  @Override
  public void quack() {
    turkey.gobble();
  }

  @Override
  public void fly() {
    for (int i = 0; i < 5; i++) {
      turkey.fly();
    }
  }
}

      通过火鸡适配器,我们将火鸡适配成了一只鸭子。这里需要说明的是,适配器模式与装饰者模式都是对源对象进行装饰,而达到一定的效果的,但是适配器模式和装饰者模式的区别在于,适配器模式是适配源对象,使其能够符合特定的接口,而装饰者模式是对源对象的功能的一个扩充,使其能做更多的工作。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • springboot对数据库密码加密的实现

    springboot对数据库密码加密的实现

    这篇文章主要介绍了springboot对数据库密码加密的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • SpringBoot2零基础到精通之数据库专项精讲

    SpringBoot2零基础到精通之数据库专项精讲

    SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架,本篇我们来学习如何连接数据库进行操作
    2022-03-03
  • 如何用Stream解决两层List属性求和问题

    如何用Stream解决两层List属性求和问题

    这篇文章主要介绍了如何用Stream解决两层List属性求和问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 2021年最新Redis面试题汇总(4)

    2021年最新Redis面试题汇总(4)

    在程序员面试过程中redis相关的知识是常被问到的话题。这篇文章主要介绍了几道Redis面试题,整理一下分享给大家,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 邮件的组织结构介绍 邮件实现详解(三)

    邮件的组织结构介绍 邮件实现详解(三)

    这篇文章主要为大家详细介绍了邮件的组织结构,邮件内容的基本格式和具体细节,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Jpa 如何使用@EntityListeners 实现实体对象的自动赋值

    Jpa 如何使用@EntityListeners 实现实体对象的自动赋值

    这篇文章主要介绍了Jpa 如何使用@EntityListeners 实现实体对象的自动赋值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • MybatisPlus为何可以不用@MapperScan详解

    MybatisPlus为何可以不用@MapperScan详解

    这篇文章主要给大家介绍了关于MybatisPlus为何可以不用@MapperScan的相关资料,文中通过图文介绍的非常详细,对大家学习或者使用MybatisPlus具有一定的参考学习价值,需要的朋友可以参考下
    2023-04-04
  • Java Hibernate中的查询策略和抓取策略

    Java Hibernate中的查询策略和抓取策略

    Hibernate是一种Java对象关系映射框架,提供了多种查询和抓取策略,用于优化数据库访问性能。查询策略包括延迟加载、立即加载、查询缓存等,抓取策略包括join抓取、子查询抓取、批量抓取等。这些策略可以根据实际应用场景进行选择和配置,提高数据访问的效率和稳定性
    2023-04-04
  • Java使用Jsoup解析html网页的实现步骤

    Java使用Jsoup解析html网页的实现步骤

    Jsoup是一个用于解析HTML文档的Java库,本文主要介绍了Java使用Jsoup解析html网页的实现步骤,可以提取文本、链接、图片等,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Java 重命名 Excel 工作表并设置工作表标签颜色的示例代码

    Java 重命名 Excel 工作表并设置工作表标签颜色的示例代码

    这篇文章主要介绍了Java 重命名 Excel 工作表并设置工作表标签颜色的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10

最新评论