面向对象设计原则
一、 教学目标
重复理解6个设计原则的概念
能够在程序设计中应用设计原则
二、 教学重点
7个原则的理解和应用环境
三、 教学难点
如何使用原则体现高内聚低耦合
泛化关系的滥用
什么情况下使用继承,什么情况下使用组合聚合。两者的区别
四、 教学过程
1、 什么是好的程序设计
设计不好的程序特点是:过于僵硬、过于脆弱、复用率低、粘度过高
设计好的程序特点是:可扩展、灵活性、可插入、可复用
好的程序设计的评价结果:高内聚低耦合(也是设计原则要达到的目标)
2、 设计原则介绍
从对象实体的角度出发尽量实现功能单一。达到高内聚的目的;(针对物对象)
从关系的角度出发减少和其他对象的关系,达到低耦合的目的。(针对事对象)
设计原则
单一职责原则 开闭原则 里氏代换原则 依赖倒转原则
接口隔离原则 合成复用原则 迪米特法则
1)单一职责原则:(如何分辨——具体的抽象对象,体现排他性)
定义:一个类,只有一个引起它变化的原因。应该只有一个职责。
职责也可以看成是系统中担任的角色
特点:一个角色对应一个抽象对象(类)
现实中:
如果杯子看成喝水,杯子的职责就是喝水,不能插花、养鱼。
如果杯子看成花瓶,杯子的职责就是插花,不能喝水、养鱼。
如果杯子看成鱼缸,杯子的职责就是养鱼,不能插花、喝水。
代码中:
![](https://img-my.csdn.net/uploads/201212/27/1356601573_6756.png)
同一个人即是行政人员,有代课。要分成为两个对象
同一个人:学生—在学校的角色、运动员—在运动场角色、孩子—在家的角色
2)开闭原则:(如何限定好——混合对象、子模块或子系统的范围)
定义:软件实体应当对扩展开放,对修改关闭。
组件化、模块化。
扩展系统通过增加或替换类的形式,不能通过修改原代码来扩展系统。
子系统的修改不会影响其他子系统
![](https://img-my.csdn.net/uploads/201212/27/1356601613_7808.png)
3)里氏代换原则:(如何实现好——泛化关系)
定义:一个软件实体如果使用的是一个基类的话,那么一定适用于其子类。而且它觉察不出基类对象和子类对象的区别。也就是说,在软件里面,把基类都替换成它的子类,程序的行为没有变化。反过来的代换不成立,如果一个软件实体使用的是一个子类的话,那么它不一定适用于基类。
特点:子类必须要实现所有的父类声明的方法,并且子类的所有方法必须都要在父类中声明。
![](https://img-my.csdn.net/uploads/201212/27/1356601657_4555.png)
4)依赖倒转原则(如何实现好——接口实现关系)
定义:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
特点:1、要针对接口编程,不要针对实现编程。
2、依赖对象要从接口传递到实现对象
![](https://img-my.csdn.net/uploads/201212/27/1356601719_4243.png)
5)接口隔离原则(如何实现好——依赖关系)
定义:客户端不应该依赖那些它不需要的接口
特点:1、如何确定依赖关系
2、将大的接口分割成小的接口,使用接口的客户端仅需要知道与之相关的方法即可。
6)合成复用原则(如何实现好——聚合、组合关系)
定义:尽量使用合成/聚合,而不是使用继承来达到复用的目的。
特点:
继承和组合的区别
继承——等于从头实现,僵硬脆弱,成为一个整体
组合——灵活,部分和整体的关系
![](https://img-my.csdn.net/uploads/201212/27/1356601848_3160.png)
什么情况下使用继承,什么情况下使用组合聚合?
当对象的内涵没有变化,只是外延的扩大或变化——使用继承
当对象的内涵变化了,产生一种新的抽象对象——使用组合
7)迪米特法则(如何实现好——关联关系,做到点到为止)
定义:一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位
特点:能够联系的对象只包括:
1) 当前对象本身(this)2) 以参数的形式传入到当前对象方法中的对象(依赖关系)
3) 当前对象的成员对象(组合关系)
4) 当前对象的成员对象是一个集合,那么集合的元素都是朋友
5) 当前对象所创建的对象
![](https://img-my.csdn.net/uploads/201212/27/1356601910_4630.png)
学生学习那些课程。学生.班级.课程
迪迷特法则要求分成两步:学生.班级 班级.课程