zoukankan      html  css  js  c++  java
  • Spring学习(2):面向接口编程思想

    一. 引言

      Spring核心的IOC的实体用了面向接口编程思想,所以有必要了解下。简单来说的话,Spring就是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。

      接口的定义的概念:泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式。关注点:抽象化,交互。(实体提供给外部的功能抽象化成一个接口(java概念),使得内部修改不影响外部与其的交互。(关注点由具体实现转移到接口交互))

    二. 正文  

    (1)先看个例子

      汽车和轮胎,假设有一辆汽车Car,Bridgestone轮胎,Michelin轮胎

    Bridgestone转动:

    public class Bridgestone{
        public void roll() {
            System.out.print("Bridgestone is rolling.");
        }
    }
    

    Michelin转动:

    class Michelin {
        public void roll() {
            System.out.print("Michelin is rolling");
        }
    }

    汽车转动:

    public class Car {
        public void roll(Bridgestone Bridgestone ) {
            Bridgestone.roll();
        }
    }
    

    (扩展性)但是如果汽车使用了Michelin轮胎,那么汽车的代码无法实现,需要修改,那么就变成如下:

    public class Car {
        public void roll(Michelin michelin ) {
            michelin.roll();
        }
    }

    可是如果还有A,B,C等牌子的轮胎(类比喻:业务需求变化)呢,那要改无数次。很明显这样子的设计类之间的代码耦合度太紧,难以复用(Car的代码无法在各中轮胎下复用,都需要修改),编写单元测试困难(?:必须保证Car的roll方法被调用时候,Bridgestone的roll方法被要被调用。单元测试这块暂时不了解。)

      单元测试概念:是指对软件中的最小可测试单元进行检查和验证。如果这个模块对其他模块有强烈的耦合的话,会造成单元测试困难。1. 单元测试代码需要更多的“桩”,因为单独出来的模块将无法正确编译执行,测试人员必须编写“桩”代码来让模块运行起来。2. 测试变的更加复杂,全面覆盖更加困难。有着复杂依赖的模块,其内部的状态更多,无法通过单元测试覆盖全面,降低了测试质量。

      如果将这两种轮胎的共同特性提取出来,汽车转动轮胎时,无须知道轮胎的特定类型(品牌,对应的子类),只要轮胎有客户所期望的接口(roll)就行了,那样Car的代码扩展性好,可以接受任意实现Trie接口的轮胎,单元测试简单(注入实现类),代码耦合度松耦合相对之前的。

    interface Tire {
        public void roll();
    }
    
    class Bridgestone implements Tire {
        public void roll() {
            System.out.print("Bridgestone is rolling.");
        }
    }
    
    class Michelin implements Tire {
        public void roll() {
            System.out.print("Michelin is rolling");
        }
    }
    public class Car {
        public void roll(Tire tire) {tire.roll(); } 
    }

      以上就是面向接口编程的一个例子。

      面向接口编程:面向接口意味着面向抽象,将各个实体之间的耦合程度由组件之间的耦合提升到接口层次,由接口做为粘合剂去维护关系,让一个实体由依赖另一个实体,转变成依赖一个接口,将被依赖实体的变化隔绝于接口之外。(在面向对象的系统中所有的类或者模块之间的交互是由接口完成的。)

    (1)接口就是标准规范,一种规范约束,有了标准去遵守就容易扩展!我们只需要面向标准编程,而不用针对具体的实现类!面向接口编程好处:(1)抽象;(2)高内聚,低耦合,降低开发成本/维护成本(Car的开发者和轮胎的开发者可以并行开发,独立测试;替换轮胎,不需要修改Car的代码)。

    (2)协调者(接口),调用者,实现者,接口本质上就是协调者来维护实现者和调用者之间的关系。实现者和调用者都必须遵循接口的规则(标准)。

    例子:JDBC,各种数据库都按照JDBC的标准规范去开发数据库驱动程序,程序员都按照JDBC的标准去使用访问数据库。好处:驱动程序编写者不用去学接口文档来向程序员解释驱动程序的用法,程序员不关心具体的数据库。

    (3)高内聚,低耦合概念

      高内聚低耦合是软件设计的一个基本原则,说的是在程序的各个模块中,尽量让每个模块独立,相关的处理尽量在单个模块中完成,就是俗话说的:该干嘛干嘛去!优点:能提降低各模块的之间的联系,减少“牵一发而动全身”的几率,提高开发效率,降低升级维护成本,也便于进行单元测试,提高软件质量。

      耦合性也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。

      高内聚关键字:最充分的利用模块中每一个元素的功能,达到功能实现最大化,内聚性越强越好,用最小的资源干最大的事情!

      低耦合关键字:项目中的各个模块之间的关联要尽可能的小,耦合性(相互间的联系)越低越好,减小“牵一发而动全身”的可能性!

         高耦合例子:一个程序有50个函数,这个程序执行得非常好;然而一旦你修改其中一个函数,其他49个函数都需要做修改,这就是高耦合的后果。

     参考资料:

      CSDN:https://blog.csdn.net/u013400743/article/details/51252003

          https://blog.csdn.net/qq376430645/article/details/9927225

      百度知道:https://baike.baidu.com/item/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1917084?fr=aladdin

           https://zhidao.baidu.com/question/271744863.html

      书籍:Spring实战第4版

  • 相关阅读:
    fedora上部署ASP.NET——(卡带式电脑跑.NET WEB服务器)
    SQL Server 请求失败或服务未及时响应。有关详细信息,请参见事件日志或其它适合的错误日志
    8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的
    FTP 服务搭建后不能访问问题解决
    指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
    Linux 安装MongoDB 并设置防火墙,使用远程客户端访问
    svn Please execute the 'Cleanup' command. 问题解决
    .net 操作MongoDB 基础
    oracle 使用绑定变量极大的提升性能
    尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
  • 原文地址:https://www.cnblogs.com/knsbyoo/p/9079374.html
Copyright © 2011-2022 走看看