软件设计模式与体系结构第一节课
软件设计模式与体系结构
面向对象的基础知识
一、面向对象设计的表示方法
UML
二、面向对象的设计原则(互相依赖,互相补充)
- 单一原则
- 开闭原则**
- 里氏代换原则
- 依赖倒转原则**
- 接口隔离原则
- 合成复用原则
- 迪米特法则
好的系统设计应具备的性能:
- 可扩展性(方便添加新功能,或修改当前功能)
- 灵活性(可依据客户不同的要求进行配置)
- 可插拔性(增加或减少功能,不影响其他功能的应用)
软件的复用或重用:提高软件的开发效率,提高软件的质量,节约开发成本,改善系统的可维护性
可维护性复用都是一面向对象设计原则为基础的
重构:在不改变软件现有功能的基础上,通过调整程序代码改善软件质量、性能,是其程序设计模式和架构更趋合理,提高软件的扩展性和维护性。
UML
重点掌握类图及其表示方法;
类图:
- 类封装了数据和行为
- 类之间的关系
- 关联关系
- 聚合/组合关系
- 泛化关系(继承)
- 接口实现(接口的作用很重要)
其他辅助视图
- 顺序图
- 状态图
单一职责原则
一个对象应该只包含单一的职责,并且该职责完整地封装在一个类中。
单一职责原则是实现高内聚、低耦合的指导方针
开闭原则
对扩展开放,对修改关闭
在设计一个模块的时候,应当是这个模块可以在不被修改的前提下呗扩展,及在不修改源代码的情况下改变这个模块的行为。
对可变性封装原则,将系统分为可变部分和固定部分,将可变因素封装起来,扩展新的功能时改变可变部分,不会对固定部分造成影响。
里氏代换原则
第一种定义方式:如果对每一类型为s的o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时;程度P的行为没有变换,那么类型S是类型T的子类型。
第二种定义方式:所有引用基类(父类)的地方必须能透明地使用其子类的对象。
因此在程序中尽量使用基类类型来对对象进行定义,而在运行时子确定其子类类型,用子类对象来替换父类对象
依赖倒转原则
定义
- 高层模块不应该依赖底层模块,它们都应该依赖
- 抽象不应该依赖于细节
- 细节应该依赖于抽象
另一种表述
- 要针对接口编程,不要针对实现编程。
代码要依赖于抽象的类,而不要依赖于具体的类;要针对接口或抽象类编程,而不是针对具体类编程。
实现开闭原则的关键在于抽象化,并且从抽象化具体化现实,如果说开闭原则是面向对象设计的目标的话,依赖倒转原则就是面向对象设计的主要手段。
实现方式:控制翻转在代码中使用抽象类,二而将具体的类放在配置文件中。
依赖注入:
- 构造注入(通过构造函数注入实例)
- 设值注入(通过Setter方法注入实例)
- 接口注入(通过接口方法注入实例)