(设计模式学习笔记)面向对象设计原则

单一职责原则(Single Responsibility Principle, SRP)

  • 定义:一个类只负责一个功能领域中的相应职责
  • 分析:一个类承担的职责越多,它被复用的可能性就越小,当其中一个职责变化时,可能会影响到其他职责的运作,因此要将不同的职责封装到不同的类中。如果多个职责总是同时发生改变,可以将它们封装到同一个类中。它是最简单但是又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。

开闭原则 (Open-Closed Principle, OCP)

  • 定义:一个软件实体应当对拓展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行拓展
  • 分析:随着时间推移需求会发生变化,软件系统在面对新的需求时,对现有系统进行拓展而不是去修改原有代码,可以保证系统的稳定性。抽象化是开闭原则实现的关键,许多面向对象语言提供接口、抽象类等机制实现抽象层,再通过具体的类进行拓展。新增业务时只需要增加新的具体类来实现新的业务功能即可

里氏代换原则 (Liskov Substitution Principle, LSP)

定义:所有引用基类的地方必须能透明的使用其子类的对象
分析:里氏替换原则是实现开闭原则的重要方式之一。由于使用基类的地方可以透明的使用其子类,因此程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象

依赖倒转原则 (Dependence Inversion Principle, DIP)

定义:抽象不应该依赖于细节,细节应该依赖于抽象,换言之,要针对接口编程,而不是针对实现编程
分析:开闭原则是目标,里氏替换原则是基础,依赖倒转原则是手段。在实现依赖倒转原则时,我们针对抽象层编程,而将具体的类对象通过依赖注入的手段注入到其他对象。

接口隔离原则 (Interface Segregation Principle, ISP)

定义:使用多个专门的接口而不是单一的总接口
分析:在面向对象编程语言中,实现一个接口就需要实现该接口中定义的所有方法,因此大的总接口使用起来不一定很方便,为了使接口的职责单一,需要将大接口中的方法根据其职责不同分别放在不同的小接口中,以确保每个接口使用起来都较为方便,并都承担某一单一角色。接口应该尽量细化,同时接口中的方法应该尽量少,每个接口中只包含一个客户端(如子模块或业务逻辑类)所需的方法即可,这种机制也称为“定制服务”,即为不同的客户端提供宽窄不同的接口

合成复用原则 (Composite Reuse Principle, CRP)

定义:尽量使用对象组合,而不是继承来达到复用的目的
分析:组合/聚合可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少;其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用

迪米特法则 (Law of Demeter, LoD)

定义:一个软件实体应当尽可能少地与其他实体发生相互作用
分析:在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;在类的设计上,只要有可能,一个类型应当设计成不变类;在对其他类的引用上,一个对象对其他对象的引用应当降到最低

你可能感兴趣的:(设计模式学习笔记)