面向对象的五大基本原则

单一职责原则(SRP)
开放封闭原则(OCP)
里氏替换原则(LSP)
依赖倒置原则(DIP)
接口隔离原则(ISP)
单一职责原则(SRP)

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

开放封闭原则(OCP)
既开放又封闭,对扩展是开放的,对更改是封闭的!

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

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

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

里氏替换原则(LSP)
子类可以替换父类并且出现在父类能够出现的任何地方

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

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

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

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

在实际编程中,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后发现,维护和实现接口的时候花了太多精力,
而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!

IOC

控制反转(Inversion of Control,英文缩写为IoC)是框架的重要特征,并非面向对象编程的专用术语。它与依赖注入(Dependency Injection,简称DI)
和依赖查找(Dependency Lookup)并没有关系。

优缺点编辑

IoC最大的好处是什么?

因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),
只要修改XML就可以了,这样我们甚至可以实现对象的热插拔(有点像USB接口和SCSI硬盘了)。
IoC最大的缺点是什么?

(1)生成一个对象的步骤变复杂了(事实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。
(2)对象生成因为是使用反射编程,在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。
(3)缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺陷所在。

实现策略编辑

IoC是一个很大的概念,可以用不同的方式实现。其主要形式有两种:
◇依赖查找:容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,
仅有的控制反转只体现在那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源。
◇依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者
构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为
构造器注入(Constructor Injection)

实现方式编辑

实现数据访问层

数据访问层有两个目标。第一是将数据库引擎从应用中抽象出来,这样就可以随时改变数据库—比方说,从微软SQL变成Oracle。不过在实践上很少会这么做,
也没有足够的理由未来使用实现数据访问层而进行重构现有应用的努力。第二个目标是将数据模型从数据库实现中抽象出来。这使得数据库或代码开源根据需要改变,
同时只会影响主应用的一小部分——数据访问层。这一目标是值得的,为了在现有系统中实现它进行必要的重构。

模块与接口重构

依赖注入背后的一个核心思想是单一功能原则(single responsibility principle)。该原则指出,每一个对象应该有一个特定的目的,而应用需要利用这一目的
的不同部分应当使用合适的对象。这意味着这些对象在系统的任何地方都可以重用。但在现有系统里面很多时候都不是这样的。

随时增加单元测试

把功能封装到整个对象里面会导致自动测试困难或者不可能。将模块和接口与特定对象隔离,以这种方式重构可以执行更先进的单元测试。按照后面再增加测试的想法
继续重构模块是诱惑力的,但这是错误的。

使用服务定位器而不是构造注入

实现控制反转不止一种方法。最常见的办法是使用构造注入,这需要在对象首次被创建是提供所有的软件依赖。然而,构造注入要假设整个系统都使用这一模式,
这意味着整个系统必须同时进行重构。这很困难、有风险,且耗时。

转载于:https://www.cnblogs.com/jgjk/p/7594824.html

面向对象的五大原则与IOC相关推荐

  1. 面向对象的五大原则是什么

    5大原则 单一职责原则(Single-Resposibility Principle) 其核心思想为:一个类,最好只做一件事,只有一个引起它的变化.单一职责原则可以看做是低耦合.高内聚在面向对象原则上 ...

  2. 面向对象设计五大原则

    一 Single Responsibility Principle--单一职责原则 核心思想: 一个类应该只有一个引起它变化的原因. 假设存在这样的设计. Rectangle类具有两个方法,一个方法是 ...

  3. solid 设计原则 php,面向对象设计SOLID五大原则

    今天我给大家带来的是面向对象设计SOLID五大原则的经典解说. 我们知道,面向对象对于设计出高扩展性.高复用性.高可维护性的软件起到很大的作用.我们常说的SOLID五大设计原则指的就是: S = 单一 ...

  4. java面向对象三大特征及五大原则

    java面向对象 一.java面向对象的三大特征 1.封装(Encapsulation) 封转是指属性私有化 根据需要提供setter和getter方法来访问属性 隐藏具体属性和实现细节,仅对外开放接 ...

  5. PHP核心技术笔记(2):面向对象的设计原则

    1.面向对象设计五大原则 面向对象设计的五大原则分别是单一职责原则.接口隔离原则.开放-封闭原则.替换原则.依赖倒置原则. 2.单一职责原则(single Pesponsibility Princip ...

  6. PHP面向对象设计的五大原则

    面向对象设计的五大原则:单一职责原则.接口隔离原则.开放-封闭原则.替换原则.依赖倒置原则.这些原则主要是由Robert C.Martin在<敏捷软件开发--原则.方法.与实践>一书中总结 ...

  7. java五大原则_Java面向对象的三大特征和五大原则

    Java面向对象的三大特征 封装 封装(Encapsulation)是指属性私有化,根据需要提供setter和getter方法来访问属性.即隐藏具体属性和实现细节,仅对外开放接口,控制程序中属性的访问 ...

  8. java五大原则_Java成长第五集--面向对象设计的五大原则

    S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则(Programming Priciple)的首字母缩写.以下图说明: 下面就个人的理解来说说这五大原则的含义到 ...

  9. 面向对象:三大特性与五大原则

    面向对象:三大特性与五大原则 面向对象(Object Oriented, OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布 ...

最新文章

  1. linux驱动模块编译入内核,Linux内核驱动模块编译
  2. 接口里面的静态方法--痒啊
  3. 图解一次Linux挂载操作和mount命令基本用法
  4. 想了解Sleuth+zipkin分布式请求链路追踪,来看看这篇文章吧!
  5. OpenWrt——Could not lock /var/lock/opkg.lock: Resource temporarily unavailable.
  6. 《简明 Python 教程》笔记
  7. python学习Day4 流程控制(if分支,while循环,for循环)
  8. 以优美方式编写JavaScript代码
  9. shell基础之多功能nginx(安装、重启、停止等)
  10. 软件测试-黑盒测试方法(一)---等价类划分、边界值、因果图、判定表
  11. UA PHYS515 电磁理论II 静电场问题7 柱坐标系中的Laplace方程与Bessel函数
  12. C# 使用FastReport.NET打印报表
  13. 新概念51单片机c语言教程考试题,新概念51单片机C语言教程例题.doc
  14. html网页div是什么意思,HTML网页中div是什么意思?
  15. visual studio fatal error C1083: 无法打开源文件
  16. Python+Vue计算机毕业设计个人学习博客系统wyz5v(源码+程序+LW+部署)
  17. 教你文本聚类(参考http://www.kuqin.com/searchengine/20080511/8323.html)
  18. 算法工程师独得恩宠 四面楚歌的Android工程师该何去何从?
  19. 分布式数据库NoSQL(十)——初识Redis
  20. 微信小程序基于百度云实现图文识别(胎教级教程)

热门文章

  1. 流量治理神器-Sentinel的限流模式,选单机还是集群?
  2. 牛逼哄哄的布隆过滤器,到底有什么用?
  3. 分享:给入职新人的IDEA培训教程。
  4. 在家搭建大数据分布式计算环境!
  5. 深度学习模型压缩与加速综述!
  6. 中科院计算所实习-深度学习方向
  7. 一文讲解机器学习算法中的共线性问题
  8. 收藏 | 做人工智能必看的45篇论文-附下载地址
  9. 【干货】NLP中对困惑度感到困惑?
  10. 美国科学院2020新晋院士名单发布!中科院曹晓风及6位华人学者入选,去年还有高福和颜宁...