面向对象七大设计原则

面向对象七大设计原则

文章转自:http://www.cnblogs.com/PGYXZ/p/4805705.html
1、开闭原则


2、里氏替换原则


3、 单一职责原则


4、接口隔离原则


5、依赖倒置原则


6、迪米特原则


7、组合/聚合复用原则


知识点关联

学习面向对象的设计模式,

是深入面向对象思想的钥匙,

通过大师级的微妙案例,

我们可以开阔自己的认知。


在学习面向对象设计七大原则之前,我们要对基本的 封装、继承、多态思想有足够的了解,

对抽象类和接口也要有足够的编码能力,因为设计模式是以上知识点的综合应用。


另外,

在接触具体的 设计模式之前

面向对象的七大设计原则会让你知道,

设计模式出现的必然性和意义所在。


每一种设计思想的精准含义,具体如下:


先从整体认识这七种设计思想。


一、开闭原则:

这一条放在第一位来理解,

它的含义是

对扩展开放,对修改关闭

解释一下就是,我们 写完的代码,不能因为需求变化就修改。我们可以通过新增代码的方式来解决变化的需求。
当然,这是一种理想的状态,在现实中,我们要尽量的缩小这种修改。


再解释一下这条原则的意义所在,

我们采用逆向思维方式来想。

如果每次需求变动都去

修改原有的代码,

那原有的代码就存在被 修改错误风险

当然这其中存在有意和无意的修改,

都会导致原有正常运行的功能失效的风险,

这样很有可能会展开可怕的蝴蝶效应,

使维护工作剧增。

 说到底,开闭原则除了表面上的可扩展性强以外,在企业中更看重的是 维护成本

 所以,

开闭原则是设计模式的第一大原则,它的潜台词是: 控制需求变动风险,缩小维护成本


以下几种原则,都是为此原则服务的。


二、里氏替换选择:


此原则的含义是子类可以在任何地方替换它的父类。解释一下,这是 多态的前提,我

们后面很多所谓的灵活,都是不改变声明类型的情况下,改变实例化类来完成的需求变更。当然,

继承的特性看似天然就满足这个条件。

但这里更注重的是继承的应用问题,

我们必须保证我们的 类和 划分是精准的。


里氏替换原则的潜台词是:尽量使用 精准抽象类或者接口


三、单一职责原则:

单一职责的含义是:

类的职责单一,引起类变化的原因单一。解释一下,这也是灵活的前提,

如果我们把类拆分成最小的职能单位,

那组合与复用就简单的多了,

如果一个类做的事情太多,在组合的时候,必然会产生不必要的方法出现,这实际上是一种 污染


举个例子,我们在绘制图案的时候,用“点”组成图和用“直线”组成图,哪个更灵活呢?一定是“点”,它可以绘制任何图形,而直线只能绘制带有直线条的图案,它起码无法画圆。


单一职责的潜台词是: 拆分最小单位,解决复用和组合问题。


四、接口隔离原则:


接口隔离原则可以说是单一职责的必要手段,

它的含义是尽量使用 职能单一的接口,

而不使用职能复杂、全面的接口。

很好理解,接口是为了让子类实现的,

如果子类想达到职能单一,那么接口也必须满足职能单一。


相反,

如果接口融合了多个不相关的方法,

那它的子类就被迫要实现所有方法,

尽管有些方法是根本用不到的。这就是 接口污染


接口隔离原则的潜台词是:拆分,从接口开始。


五、依赖倒置原则:


想要理解依赖倒置原则,

必须先理解 传统的解决方案。

面相对象的初期的程序,

被调用者依赖于调用者。

也就是调用者决定被调用者有什么方法,

有什么样的实现方式,

这种结构在需求变更的时候,会付出很大的 代价,甚至推翻重写。


依赖倒置原则就是

要求调用者和被调用者 都依赖抽象

,这样两者 没有直接的关联和接触,在变动的时候,一方的变动不会影响另一方的变动。


其实,依赖倒置和前面的原则是相辅相成的,都强调了 抽象的重要性。


依赖倒置的潜台词是:面向抽象编程,解耦调用者和被调用者。


六、迪米特原则:


迪米特原则

要求尽量的 封装,尽量的 独立,尽量的使用 低级别的访问修饰符。这是封装特性的典型体现。


一个类如果暴露太多私用的方法和字段,

会让调用者很茫然。

并且会给类造成不必要的判断代码。

所以,我们使用尽量低的访问修饰符,

让外界不知道我们的内部。这也是面向对象的基本思路。这是迪米特原则的一个特性,无法了解类更多的私有信息。


另外,

迪米特原则要求 类之间的直接联系尽量的少

两个类的访问,通过第三个中介类来实现。

迪米特原则的潜台词是:不和陌生人说话,有事去中介。


七、组合/聚合复用原则:

此原则的含义是,如果

只是达到代码 复用的目的,尽量 使用组合与聚合,而不是继承。这里需要解释一下,

组合聚合只是引用其他的类的方法,而不会受引用的类的继承而改变血统。



继承的耦合性更大,比如一个父类后来添加实现一个接口或者去掉一个接口,

那子类可能会遭到毁灭性的编译错误,

但如果只是组合聚合,只是引用类的方法,

就不会有这种巨大的风险,同时也实现了复用。


组合聚合复用原则的潜台词是:我只是用你的方法,我们不一定是同类。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值