java 设计模式之依赖倒置实例详解

 更新时间:2019年11月18日 10:29:32   作者:倾听岁月  
这篇文章主要介绍了java 设计模式之依赖倒置,结合实例形式详细分析了依赖倒置的相关概念、原理、使用技巧及相关操作注意事项,需要的朋友可以参考下

本文实例讲述了java 设计模式之依赖倒置。分享给大家供大家参考,具体如下:

依赖倒置的概念我也是在一篇博文上理解的,我觉得很精辟,所以收录在我的博客中。

类A 依赖 类B,之后根据需求 类A 变换为依赖 类C,这时候我们认为类A 是高层模块, 类B 和 类C 是低层模块。

什么是高层模块?什么是底层模块?
高层模块你可以理解为控制层,负责复杂的业务逻辑。
低层模块你可以理解为数据层,负责基本的原子操作。

什么意思? 我举个例子。
比如大胃王比赛。
在这场比赛中的规则是比赛谁吃馒头吃的最多。有参赛选手Q和W

/**
 * 馒头 实体类
 */
class SteamedBuns
{
  private String name = "馒头"; 
  public String getName()
  {
    return this.name;
  }
}
class Player
{
  //得了多少分
  private int intgral;
  private Sting name;
  public Player(String name)
  {
    setName(name);
  }    
  public void setName(String name)
  {
    this.name = name;
  }
  public String getName()
  {
    return name;
  }
  public void setIntgral(int intgral)
  {
    this.intgral= intgral;
  }
  public int getIntgral()
  {
    return this.intgral;
  }
  public void eat(SteamedBuns steamedBuns)
  {
    System.out.println("我开吃了");
    setIntgral(getIntgral() + 1);
  }
}
public class Main
{
  pubic static void main(String[] agrs)
  {
    Player q = new Player("Q");//选手Q
    Player w = new Player("W");//选手W
    q.eat(new SteamedBuns());//选手Q吃馒头
    w.eat(new SteamedBuns());//选手W吃馒头
  }
}

那么,之后问题来了。Q和W 比分一样,胃口太大把馒头吃光了,现在好追加比赛吃包子。 但Q和W 的实体只支持吃馒头,这个不符合情理哇,不可能一个人能吃馒头不能吃包子哇。

public void eat(SteamedBuns steamedBuns)//选手只支持吃馒头

有的同学可能会想到用重载这个方法。

public void eat(SteamedBuns steamedBuns){}   //选手支持吃馒头
public void eat(SteamedStuffedBun steamedStuffedBun){} //选手支持吃包子

思路是正确的,但是在实际开发中,这样做,可能会给程序带来不必要的风险。
这时候依赖倒置的优越性就体现出来了。
还是思考。既然馒头吃光了,现在要比赛吃包子,那么我们想一下如果包子也吃光了还没有分出胜负,要继续追加比赛怎么办?再用重载吗? 人都是可以吃食物的,我们要让包子和馒头都实现食物接口。而参赛选手的依赖应该从包子和馒头 抽象出来 依赖食物接口。 这样只要一个类实现了食物接口,那么都能被吃。

/**
 * 食物接口
 */
interface Food
{
  public String getName();
}
/**
 * 馒头 实体类
 */
class SteamedBuns implements Food
{
  private String name = "馒头";
  @Override
  public String getName()
  {
    return this.name;
  }
}
/**
 * 包子 实体类
 */
class SteamedStuffedBun implements Food
{
  private String name = "包子";
  @Override
  public String getName()
  {
    return this.name;
  }
}
class Player
{
  private int intgral;
  private Sting name;
  public Player(String name)
  {
    setName(name);
  }  
  public void setName(String name)
  {
    this.name = name;
  }
  public String getName()
  {
    return name;
  }
  public void setIntgral(int intgral)
  {
    this.intgral= intgral;
  }
  public int getIntgral()
  {
    return this.intgral;
  }
  /**取消对具体食物种类的依赖
  public void eat(SteamedBuns steamedBuns)
  {
    System.out.println("我开吃了");
    setIntgral(getIntgral() + 1);
  }
  */
  public void eat(Food food)
  {
    System.out.println("我开吃了");
    setIntgral(getIntgral() + 1);
  }
}
public class Main
{
  pubic static void main(String[] agrs)
  {
    Player q = new Player("Q");//选手Q
    Player w = new Player("W");//选手W
    q.eat(new SteamedBuns());//选手Q吃馒头
    w.eat(new SteamedBuns());//选手W吃馒头
    q.eat(new SteamedStuffedBun());//选手Q吃包子
    w.eat(new SteamedStuffedBun());//选手W吃包子
  }
}

这样的设计有助于降低类之间的耦合程度,抽象稳定的多,细节交给实现类。

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • springboot全局字符编码设置方式(解决乱码问题)

    springboot全局字符编码设置方式(解决乱码问题)

    这篇文章主要介绍了springboot全局字符编码设置方式(解决乱码问题),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 关于Java如何正确地实现方法重载详解

    关于Java如何正确地实现方法重载详解

    在一个类中,可以定义多个构造方法,这叫做方法的重载!但是关于方法重载,具有有哪些要求和细节?在今天的这篇文章中,小编给大家详细说说方法重载相关的内容,需要的朋友可以参考下
    2023-05-05
  • java异常处理的简单练习

    java异常处理的简单练习

    下面小编就为大家带来一篇java异常处理的简单练习。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • 如何解决 Java 中的 IndexOutOfBoundsException 异常(最新推荐)

    如何解决 Java 中的 IndexOutOfBoundsException 异

    当我们在 Java 中使用 List 的时候,有时候会出现向 List 中不存在的位置设置新元素的情况,从而导致 IndexOutOfBoundsException 异常,本文将会介绍这个问题的产生原因以及解决方案
    2023-10-10
  • java 整型数与Integer的缓存深入理解

    java 整型数与Integer的缓存深入理解

    这篇文章主要介绍了java 整型数与Integer的缓存深入理解的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java SimpleDateFormat线程安全问题原理详解

    Java SimpleDateFormat线程安全问题原理详解

    这篇文章主要介绍了Java SimpleDateFormat线程安全问题原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • java抓取网页数据获取网页中所有的链接实例分享

    java抓取网页数据获取网页中所有的链接实例分享

    java抓取网页数据获取网页中所有的链接实例分享,使用方法,只要实例化HtmlParser时传入网页地址就可以了
    2013-12-12
  • 获取JsonObject某一未知key的值操作

    获取JsonObject某一未知key的值操作

    这篇文章主要介绍了获取JsonObject某一未知key的值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Spring中HandlerAdapter接口源码解析

    Spring中HandlerAdapter接口源码解析

    这篇文章主要介绍了Spring中HandlerAdapter接口源码解析,HandlerAdapter是一个适配器接口类,适配器模式是指两个不兼容接口之间的桥梁,要想让一个接口使用另外一个接口的实现中间可以加一层适配器类,需要的朋友可以参考下
    2023-11-11
  • SpringBoot实现OneDrive文件上传的详细步骤

    SpringBoot实现OneDrive文件上传的详细步骤

    这篇文章主要介绍了SpringBoot实现OneDrive文件上传的详细步骤,文中通过代码示例和图文讲解的非常详细,对大家实现OneDrive文件上传有一定的帮助,需要的朋友可以参考下
    2024-02-02

最新评论