面向对象设计原则
1.面对对象设计原则共有7个:
单一职责原则
开闭原则
里氏代换原则
依赖倒转原则
接口隔离原则
合成复用原则
迪米特法则
学习过程是这样子的:要求掌握每一个原则的中英文名,缩写。中英文定义,并掌握一个实例
2.这些原则的目标是 实现软件的可复用性和可维护性(扩展和修改)
3.单一职责原则(Single Responsibility Principle,SRP)
定义:在软件系统中,一个类只负责一个功能领域中的相应职责。
There should never be more than one reason for a class to change.
或 就一个类而言,只能有一个引起它变化的原因。
·单一职责原则是实现高内聚,低耦合的指导方针。
实例:
在Login类中,init()初始化界面,display() 显示界面,valicate() 验证登陆名和密码,getConnectiong()获取数据库连接,……..在这个类中有至少四个引起它变化的原因,那么如何根据单一职责原则进行重构呢~~~
4.开闭原则(Open-Close Principle,OCP)
定义: 一个软件实体,对修改是关闭的,对扩展是开放的。
Software entities should be open for extension,but closed for modification.
抽象化是开闭原则的关键。
实例:
想要改变Button,如果像上面这样写,就要修改源代码,违背了开闭原则。
所以我们进行重构:
提取一个抽象层,然后在配置文件中指定使用的是哪一个子类。
5.里氏代换原则(Liskov Substitution Principle,LSP)
定义: 出现父类的地方可以用子类的对象代替,而不会产生异常。
Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。
6.依赖倒转原则(Dependence Inversion Principle,DIP)
定义:要针对接口编程,不要针对实现编程
Program to an interface,not an implementation.
开闭原则是面向对象设计的目标,里氏代换原则是实现开闭原则的基础,依赖倒转原则是主要手段。
7.接口隔离原则(Interface Segregation Principle,ISP)
定义: 一旦一个接口太大,则需要把它分割成一些更细小的接口,使用该接口的客户端仅
需知道与之相关的方法即可。
使用多个专门的接口,而不使用单一的总结口。每一个接口应该承担一种相对独立的角色。
可以在进行系统设计的时候采用定制服务的方式,即为不同的客户端提供宽窄不同的接口,只提供用户需要的行为,隐藏用户不需要的行为。
实例:
重构之后:
8.合成复用原则。很重要!!!(Composite Reuse Principle,CRP)
定义:尽量使用对象组合,而不使用继承来达到复用的目的。
Favor composition of objects over inheritance as a reuse mechanism.
扩展的时候用继承,复用的时候用关联。
继承复用的缺点:
1. 破坏封装性。不管想用的不想用的方法全部都继承了。无法实现选择性继承。
2. 如果想要更换父类,必须修改源代码,违背了开闭原则。
那么,关联复用是怎么实现更换父类的呢
B类一开始关联了A类,使用A类的m()方法,后来觉得A1类的m()方法更好,为了遵守开闭原则,使用一个A1Adapt类继承A类,然后在A1Adapt类中重写m()方法,再重写时使用A1类的m()方法。这也就是适配器模式。
3. 只能在有限的条件下使用,比如说,如果A1类是final类呢?。。。
8.迪米特法则(Law of Demeter)
为了降低系统的耦合度,可以适量增加中介者类。