设计模式学习笔记(4)-接口和抽象类
接口和抽象类的区别
- 抽象类不能被实例化,只能被继承
- 抽象类可以包含属性和方法,方法既可以包括代码实现,也可以不包含代码实现(抽象方法)
- 子类继承抽象类,必须实现抽象类的所有方法
- 接口不能包含属性
- 接口只能声明方法,不包括代码实现
- 类实现接口,必须实现接口中所有的方法
抽象类和接口的意义
抽象类是对成员变量和方法的抽象,是一种is-a 关系,是为了解决代码复用问题,接口仅仅是方法的抽象,是一种has-a 关系,表示具有某种行为特性,是为了解决解耦问题,
如何决定使用抽象类还是接口
- 解决代码复用,并且是 is-a 关系 使用抽象类
- 解决抽象而非代码复用,且是has-a 关系,使用接口
基于接口(抽象)而非实现编程
越抽象,越脱离具体某一细节的设计,越能提高代码的灵活性,越能应对未来的需求变化
- 函数命名要具有抽象思维,不要暴露实现细节
- 封装具体的实现细节
- 为实现类定义抽象的接口,具体的实现类都依赖统一的接口定义,遵从一致的协议,调用者依赖接口而不是实现类
- 避免过度使用抽象,尊从设计初衷,接口实现分离,封装不稳定的实现,暴露稳定的接口,即给调用者使用的代码要稳定
少用继承,多用组合
- 继承层次加深,导致代码可读性变差,因为要搞清楚某个类的属性方法,要不断的查看父类代码。另一方面破坏封装性,将父类的实现细节暴露给子类,造成两者高度耦合
- 使用组合、接口、委托三个技术手段解决上诉问题
附上大牛课程,需要可以直接去学习
金钱和自由相比,不值一提