一.OO(面向对象)的设计基础
面向对象(OO):就是基于对象概念,以对象为中心,以类和继承为构造机制,充分利用接口和多态提供灵活性,
来认识、理解、刻划客观世界和设计、构建相应的软件系统。面向对象的特征:虽然各种面向对象编程语言相互有别,但都能看到它们对面向对象基本特征的支持, 即 “抽象、封装、继承、多态” : – 抽象,先不考虑细节 – 封装,隐藏内部实现 – 继承,复用现有代码 – 多态,改写对象行为面向对象设计模式:是“好的面向对象设计”,所谓“好的面向对象设计”是那些可以满足“应对变化,提高复用”的设计。面向对象设计模式描述的是软件设计,因此它是独立于编程 语言的,但是面向对象设计模式的最终实现仍然要使用面向对象编程语言来表达。面向对象设计模式不像算法技巧,可以照搬照用,它是建立在对“面向对象”纯 熟、深入的理解的基础上的经验性认识。上边就见大的描述一下面向对象和设计模式的概念和关系。我们进行设计的时候,就是充 分的理解和
利用OO的四个基本的特征来展开设计,所以大家必须在进行设计前,要熟悉和掌握面向对象的技术,在这就不详细介绍了,而对于设计模式是给我们提供了设计时的参考模型,而掌握面向对象设计模式的前提是首先掌握“面向对象”技术。二.OO(面向对象)的设计目标
※可扩展性Extensibility:有了新的需求,新的性能可以容易添加到系统中,不影响现有的性能,也不会带来新的缺陷。
※可修改性Flexibility:系统一部分的代码要修改时不会破坏系统的现有结构,也不会影响到其它的部分。※可替换性Pluggability:可以将系统中的某些代码替换为相同接口的其它类,不会影响到系统。三.OO设计的5大原则及其之间的关系
3.1 OO设计原则的总结
※单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。单一是一个类的优良设计。交杂不清的职责将使得代码看起来特别别扭牵一发而动全身,
有失美感和必然导致丑陋的系统错误风险。 ※开放封闭原则:是说软件实体(类、模块、函数等等)应该可以扩展但不可修改。实现开开放封闭原则的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以修改就是封闭的;而通过面向对象的继承和多态机制,又可以实现对抽象类的继承,通过覆写其方法来改变固有行为,实现新的拓展方法,所以就是开放的。“需求总是变化”没有不变的软件,所以就需要用封闭开放原则来封闭变化满足需求,同时还能保持软件内部的封装体系稳定,不被需求的变化影响。 ※依赖倒置原则:依赖抽象,不要依赖具体。抽 象的稳定性决定了系统的稳定性,因为抽象是不变的,依赖于抽象是面向对象设计的精髓,也是依赖倒置原则的核心。依赖于抽象是一个通用的原则,而某些时候依 赖于细节则是在所难免的,必须权衡在抽象和具体之间的取舍,方法不是一层不变的。依赖于抽象,就是对接口编程,不要对实现编程。 ※里氏代换原则:子类型必须能够替换到他们的父类型。Liskov 替换原则,主要着眼于对抽象和多态建立在继承的基础上,因此只有遵循了Liskov替换原则,才能保证继承复用是可靠地。实现的方法是面向接口编程:将公 共部分抽象为基类接口或抽象类,通过ExtractAbstractClass,在子类中通过覆写父类的方法实现新的方式支持同样的职责。Liskov替 换原则能够保证系统具有良好的拓展性,同时实现基于多态的抽象机制,能够减少代码冗余,避免运行期的类型判别。 ※接口隔离原则: 多个和客户相关的接口要好于一个通用接口。分离的手段主要有以下两种:1、委托分离,通过增加一个新的类型来委托客户的请求,隔离客户和接口的直接依赖,但是会增加系统的开销。2、多重继承分离,通过接口多继承来实现客户的需求,这种方式是较好的。下边是前面没有提到过的两个原则,也是设计时要考虑的重要原则。※迪米特法则:不相互直接通信的类之间,不要直接发生相互作用。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果一个类需要调用领一个类的某个方法话,可以通过第三者转发这个调用。迪米特法则首先强调的前提是在类的设计上,每一类都应当尽量降低成员的访问权限。它的根本思想是强调类之间的松耦合。 ※合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用继承。合 成(Composition)和聚合(Aggregation)都是关联的特殊种类,聚合表示一种弱的拥有关系;合成这是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。优先使用合成或聚合原则将有助于保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规 模,并且不太可能增长为不可控制的庞然大物 3.2 OO设计原则之间的关系1. 实现“开-闭”原则(OCP)的关键步骤是抽象化。基类与子类之间的继承关系就是抽象化的体现。 因此里氏代换原则是对实现抽象化的具体步骤的规范。 违反里氏代换原则意味着违反了“开-闭”原则,反之未必。2. “开-闭”原则与依赖倒转原则(DIP)是目标和手段的关系。如果说开闭原则是目标,依赖倒转原则 是到达"开闭"原则的手段。如果要达到最好的"开闭"原则,就要尽量的遵守依赖倒转原则, 依赖倒转原则是对"抽象化"的最好规范。3. 里氏代换原则(LSP)是依赖倒转原则的基础,依赖倒转原则是里氏代换原则的重要补充。4. 接口分离原则(ISP)也是确保“开-闭”原则的一个重要手段。5. 对于单一职责原则(SRP),个人认为尽量做到为好,职责越单一,“开-闭”和里氏代换越容易实现。