zoukankan      html  css  js  c++  java
  • IoC(控制反转) DI(依赖注入) 面向对象五大原则

    Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

      ●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

      ●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

    DI—Dependency Injection,即“依赖注入”组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

      理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

      ●谁依赖于谁:当然是应用程序依赖于IoC容器

      ●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源

      ●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象

      ●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)

    面向对象的五大基本原则
    单一职责原则(SRP)
    开放封闭原则(OCP) 
    里氏替换原则(LSP) 
    依赖倒置原则(DIP) 
    接口隔离原则(ISP)

    单一职责原则(SRP)

    •      一个类应该仅有一个引起它变化的原因(最简单,最容易理解却最不容易做到的一个设计原则)
    职员类例子:
      比如在职员类里,将工程师、销售人员、销售经理这些情况都放在职员类里考虑,其结果将会非常混乱,在这个假设下,职员类里的每个方法都要if else判断是哪种情况,从类结构上来说将会十分臃肿,并且上述三种的职员类型,不论哪一种发生需求变化,都会改变职员类!这个是大家所不愿意看到的!

    开放封闭原则(OCP)

    •      既开放又封闭,对扩展是开放的,对更改是封闭的!

    •      扩展即扩展现行的模块,当我们软件的实际应用发生改变时,出现新的需求,就需要我们对模块进行扩展,使其能够满足新的需求!

    更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!

    这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!


    里氏替换原则(LSP)

    •      子类可以替换父类并且出现在父类能够出现的任何地方

    •      这个原则也是在贯彻GOF倡导的面向接口编程!
    在这个原则中父类应尽可能使用接口或者抽象类来实现!

    子类通过实现了父类接口,能够替父类的使用地方!
    通过这个原则,我们客户端在使用父类接口的时候,通过子类实现!
    意思就是说我们依赖父类接口,在客户端声明一个父类接口,通过其子类来实现
    这个时候就要求子类必须能够替换父类所出现的任何地方,这样做的好处就是,在根据新要求扩展父类接口的新子类的时候而不影响当前客户端的使用!

    依赖倒置原则(DIP)

    •      传统的结构化编程中,最上层的模块通常都要依赖下面的子模块来实现,也
    称为高层依赖低层!
    所以DIP原则就是要逆转这种依赖关系,让高层模块不要依赖低层模块,所以称之为依赖倒置原则!

    ISP 接口隔离原则

    •      这个原则的意思是:使用多个专门的接口比使用单个接口要好的多!

  • 相关阅读:
    最短路总结
    关于最小生成树(并查集)prime和kruskal
    关于优先队列浅析(priority_queue)
    惨痛第十届蓝桥杯总结(附录蓝桥省赛知识点总结)-C++ B组
    初识STL vector
    sort();对结构体数组的排序
    Git 分支管理
    Git 远程仓库
    Matlab R2016a 破解教程
    Ubuntu卡在logo界面
  • 原文地址:https://www.cnblogs.com/nsl714745601/p/7594364.html
Copyright © 2011-2022 走看看