OOAD & OOP
一、面向对象技术基本概念
面向对象技术基于对象概念,以对象为中心,以类和继承为构造机制,充分利用接口和多态提供灵活性,来认识、理解、刻划客观世界和设计、构建相应的软件系统.
面向对象的特征
– 抽象,先不考虑细节
– 封装,隐藏内部实现
– 继承,复用现有代码
– 多态,改写对象行为
二、面向对象的设计目标
1、可扩展性Extensibility
–容易添加新的功能
2、灵活性Flexibility
–容易添加新的功能代码修改平稳地发生
3、可插入性Pluggability
–容易将一个类抽出去,同时将另一个有同样接口的类加入进来
三、面向对象设计基本的设计原则:
1、针对接口编程,而不是针对实现编程
– 客户无需知道所使用对象的特定类型,只需要知道对象拥有客户所期望的接口。
2、优先使用对象组合,而不是类继承
– 继承在某种程度上破坏了封装性,子类父类耦合度高;而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。
3、封装变化点
– 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。
四、面向对象的设计原则:
1、“开-闭”原则(Open-Closed Principle,OCP)封装的问题 - 对可变性封装
一个软件实体应当对扩展开放,对修改关闭。 你添加新功能的时候应该只是向代码集中添加新的代码不应该修改原来的代码。
2、里氏代换原则(Liskov Substitution Principle, LSP) 职责的问题 - 如何进行继承
LSP原则要求子类可以无条件的替代父类,子类不能对父类没有暴露的接口进行扩展,客户要调用功能只能通过父类暴露的接口来调用用不能擅自向子类调用。
3、依赖倒转原则(dependence inversion principle, DIP) 耦合度问题 - 针对接口编程
依赖倒转原则就是要实现依赖于抽象,抽象不要依赖于实现。要针对接口编程,不要针对实现编程。
4、合成/聚合复用原则(Composite/Aggregate Reuse Principle或CARP) 复用问题 - 尽量使用组合/聚合、尽量不使用继承
在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用这些对象的目的。
5、迪米特法则(Law of Demeter,LoD) 耦合度问题 - 不要和陌生人说话
一个软件实体应当尽可能少的与其他实体发生相互作用。 迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
6、接口隔离原则(interface separate principle, ISP) 职责单一 - 恰当的划分角色和接口
使用多个专门的接口比使用单一的总接口要好。也就是说,一个类对另外一个类的依赖性应当是建立在最小的接口上。
五、目标与原则的关系
可扩展性Extensibility
开/闭原则、里氏替换原则、依赖倒转原则、合成/聚合复用原则
灵活性Flexibility
开/闭原则、Demeter 法则、接口隔离原
可插入性Pluggability
开/闭原则、里氏代换原则、依赖倒转原则、合成/聚合复用原则