设计模式(1)之面向对象设计原则
面向对象设计原则是学习设计模式的基础,每一种设计模式都符合某一种或者多种面向对象设计原则。通过在软件开发中使用这些原则可以提高软件的可维护行和可用性,让我们可以设计出更加灵活也更加容易扩展的软件系统,实现可维护可复用的目标。
准确的理解面向对象原则有力与我们更好的学习和理解设计模式。
1.单一职责原则
一个对象应该只包含单一的职责,病也该职责被完整的封装在一个类中。另一种定义是就一个类而言,应该仅有一个引起它变化的原因。
一个类应该只负责一种职责,如果职责太多,将导致系统非常脆弱,可复用性较低,系统的可维护行也被降低。
2.开闭原则
一个软件实体应当对扩展开发,对修改关闭。比如要增加一个新的产品类,还需要修改其他代码,这就不算是遵守开闭原则。
在设计一个模块的时候,应使是这个模块可以在不被修改的前提下进行扩展,即实现在不修改源代码的情况下改变这个模块的行为。
为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。如果需要修改系统的行为,无需对抽象层进行改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统功能,达到开闭原则的要求。
3.里氏代换原则
在软件中如果能够使用基类对象,那么一定能够使用其子类对象。把基类都替换成他的子类,程序将不会产生任何错误和异常。然过来则不成立,如果一个软件实体使用的是一个子类的话,那么他不一定能使用基类。
子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。
在运用里氏代换原则时,尽量把父类设计为抽象类或者借口,让子类继承父类或者实现父类借口,并实现在父类中声明的方法,这样,运行时,子类实例就可以替换父类实例,我们可以很方便的扩展系统的功能,同事雾须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。
里氏代换原则是开闭原则的具体实现手段中之一。
4.依赖倒转原则
高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
代码要依赖于抽象的类,而不要依赖具体的类。要针对接口或者抽象类进行编程,而不要针对具体的类编程。也就是说,在程序代码中传递参数时活在组合聚合关系的时候,尽量引用层次高的抽象层类,即使用抽象类和接口进行变量类型生命、方法返回类型声明以及数据类型的转换,而不要用具体类来做这些事情。为了确保依赖原则的成立,具体类应该只实现接口和抽象类中的方法,不能增加多余的方法,否则无法调用增加的方法。
实现开闭原则的关键就是抽象化,并且从抽象化导出具体化实现。如果说开闭原则是面向对象的设计目标,那么依赖倒转原则就是面向对象设计的主要手段。有了抽象层,可以使系统有关更好的灵活性。在程序中金莲使用抽象类和接口进行编程,而将具体类写在配置文件中,如果系统行为发生变化,只需要扩展抽象类和接口,并修改配置文件,而无需修改原代码而达到扩展系统功能的目的,从而满足了闭合原则的要求。
依赖倒转原则要求客户端依赖于抽象耦合,以抽象的方式耦合是依赖倒转原则的关键。由于一个抽象耦合关系总要涉及到具体类从抽象类继承,并且需要保证在任何引用基类的地方都可以替换为子类,因此 里氏替换原则是依赖倒转原则的基础。
5.接口隔离原则
一旦一个接口太大,则需要将它分割成一些更些小的接口,使用该接口的客户端仅需要知道与之相关的方法即可。
实质上,接口隔离原则是指使用多个专门的接口,而不是使用单一的总接口,每一个接口应该承担一种相对独立的角色,不该干的事情一件不干,该干的一件都不能少干。
在使用接口隔离原则时,要把握好接口的粒度,如果太小 则导致系统接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用不方便。一般 接口中包含某一类客户端需要的方法即可。
6.合成复用原则
合成复用原则是面向对象设计中非常重要的一条原则,为了降低系统中类之间的耦合度,该原则提倡少用继承关系,多用关联关系。
合成复用原则就是指在一个新的对象里通过关联关系,包括组合关系和聚合关系,来使用一些已经存在的对象,使之成为新对象的一步文。新对象通过委派调用已有对象的方法达到复用其已有功能的目的。简言之:要尽量使用组合或者聚合关系。少用继承。
7.迪米特法则
迪米特法则要求一个软件实体应当尽可能的减少与其他实体发生相互作用。