提高一个软件系统的可维护性和可复用性是面向对象软件设计的核心问题,软件的可维护性是指软件能够被理解、改正、适应及扩展的难易程度,软件的可复用性是指软件能够被重复使用的难易程度。可维护性的复用是以设计原则为基础的,下面列举7个重要的的面向对象设计原则:
-
单一职责原则(SRP):一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中。用于控制类的粒度大小,是实现高内聚、低耦合的指导方针。一个类(大到模块小到方法)承担的职责越多,它被复用的可能性就越小。
-
开闭原则(OCP):软件实体应当对扩展开放,对修改关闭。软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类,抽象化设计(接口和实现类)是开闭原则的关键。在对每一个模式进行优缺点评价时都会将开闭原则作为一个重要的评价依据,以判断该模式是否具备良好的灵活性和可扩展性。
-
里氏代换原则(LSP):所有引用基类的地方必须能透明的使用其子类的对象。可以理解为Java的向上造型,里氏代换原则是实现开闭原则的重要方式之一,在程序中应当尽量使用基类类型对对象进行定义,在运行时再确定其子类类型,用子类类型来替换父类对象。在运用里氏代换原则时应该将父类设计为抽象类或接口,让子类继承父类或实现接口,这样在扩展系统功能时无需修改原有子类代码可以通过增加一个新的子类来实现。
-
依赖倒转原则(DIP):高层模块不应该依赖底层模块,它们都应该依赖抽象。抽象不应该依赖细节,细节应该依赖于抽象,想想MVC设计。如果说开闭原则是面向对象设计的目标,那么依依赖倒转就是面向对象设计的实现机制之一,想想spring的IOC机制(构造注入、设值注入(Setter注入)和接口注入),依赖倒转原则要求针对接口编程,不要针对实现编程。
-
接口隔离原则(ISP):客户端不应该依赖那些它不需要的接口。接口指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象,或者指某种语言具体的“接口”,如Java中的interface。在使用该原则时要注意控制接口粒度不能太小,这样会导致接口泛滥不利于维护,也不能太大,不然违背了接口隔离原则,灵活性差使用起来不方便。
-
合成复用原则(CRP):优先使用对象组合,而不是通过继承达到复用的目的。继承复用也被称为“白箱复用”,会破坏系统的封装性,组合复用也被称为“黑箱复用”,其耦合度相对较低,成员对象的变化对新对象的影响不大。一般而言,如果两个类是“Has-A”关系则使用组合或聚合,如果是“Is-A”则使用继承。
-
迪米特法则(LoD):每一个软件单位对其它单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位,也被称为“最少知识原则”。一个软件实体应当尽可能少的与其它实体发生相互作用,应用该法则可降低系统的耦合度,使类与类保持松散的耦合关系。
注:1:一般情况下开闭原则、里氏代换原则和依赖倒转原则会同时出现,开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段,它们相辅相成,相互补充,目标一致,只是分析问题时站的角度不同而已。
注2:迪米特法则的定义之一是不要和“陌生人”说话,只与你的朋友通信,对于一个对象其“朋友”包括以下几类:
1)当前对象本身(this)。
2)以参数形式传到当前对象方法中的对象。
3)当前对象的成员对象。
4)如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友。
5)当前对象所创建的对象。
设计模式起源于建筑领域:模式是在特定环境下人们解决某一重复出现问题的成功或有效的解决方案。
设计模式的定义:设计模式是在特定环境下为解决耨一 通用软件设计问题提供的一套定制的解决方案,该方案描述了类与对象之间的相互作用。
设计模式的基本要素有:模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式。其中关键要素是模式名称、问题、解决方案和效果。
GoF23种设计模式根据目的可分为:创建型、结构型和行为型。根据范围可分为:类模式和对象模式。
范围/目的 | 创建型模式 | 结构型模式 | 行为型模式 |
---|---|---|---|
类模式 | 工厂方法模式 | (类)适配器模式 | 解释器模式、 模板方法模式 |
对象模式 | 抽象工厂模式、 建造者模式、 原型模式 单例模式 | (对象)适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 | 职责链模式 命令模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 访问者模式 |
设计模式的优点:
- 降低开发人员理解系统的复杂度
- 使得重用成功的设计更加容易,并避免那些导致不可重用的设计方案。
- 使得设计方案更加灵活,且易于修改。
- 提高软件系统的开发效率和软件质量。
- 有助于初学者更深入的理解面向对象思想。
以上就是我对《Java设计模式》前两章的总结,后面的坑慢慢填。。。