单一职责原则
不要存在多与一个导致类变更的原因,一个类只负责一项职责
用例
MyBatis 中的 PerpetualCache 类,只负责缓存功能。
里氏替换原则
定义1:如果对每一个为 T1 类型的对象 t1,都有类型为 T2 的对象 t2,使得已 T1 类型定义的所有程序 P,在所有的对象 t1 都代换成 t2 时,程序 P 的行为没有发生变化,那么类型 T2 是 T1 的子类型。
定义2:所有引用基类的地方必须能透明地使用其子类的对象。
通俗讲:子类可以扩展父类的功能,但不能改变父类原有的功能
当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。
用例
MyBatis 中 SimpleExecutor 类,扩展了 父类 BaseExecutor,但没有修改父类的方法,只是在父类上进行功能扩展
依赖倒置原则
系统高层次的模块不应该依赖低层模块的实现,二者都应该依赖其抽象类或者接口,抽象接口不应该依赖具体的实现类,而具体实现类应该依赖抽象。
简单来说:我们要面向接口编程,当需求发生变化时对外接口不变,只要提供新的实现类即可。
用例
MyBatis 中 SimpleExecutor 类,依赖父类 BaseExecutor,但父类 BaseExecutor 没有依赖SimpleExecutor,他们都依赖 Executor 接口。
接口隔离原则
一个类对另一类的依赖应建立在最小的接口上。
简单来说,我们在设计接口时,不要设计出庞大膝肿的接口,因为实现这种接口时需要实现很多不必要的方法 我们要尽量设计出功能单一的接口,这样也能保证实现类的职责单一。
用例
MyBatis 的 BaseExecutor 对 BlockingCache 的依赖,只是用了 Cache 接口的基本方法,没有其他额外的接口依赖,BlockingCache 实现简单 Cache 接口非常简单,值实现了阻塞功能。
迪米特原则
一个对象应该对其他对象保持最少的了解。 简单来说,就是要求我们降低类间耦合。
用例
BaseExecutor 使用 BlockingCache 阻塞缓存功能,只使用了阻塞缓存功能,怎样实现的阻塞缓存,它都不了解。都由 BlockingCache 来实现。
开放关闭原则
程序要对扩展开放,对修改关闭。简单来说,当需求发生变化时,我
们可以通过添加新的模块满足新需求,而不是通过修改原来的实现代码来满足新需求。
用抽象构建框架,用实现扩展细节。
用例
MyBatis 的 Cache 接口,如果实现新的缓存类型,只需要添加相应的实现类,对扩展开放,对修改关闭。
在这六条原则中,开放-封闭原则是最基础的原则,也是其他原则以及后文介绍的所有设计模式的最终目标。
网友评论