设计原则本身并不是一个孤岛,各原则间有不少类似的原理和作用,需要理解的是各原则相对应的应用场景与职责
1, 单一职责原则( Single Responsibility Principle )
SRP应用于接口,模块,类,讲究的是自身只完成一个职责。
这个职责的粒度需要在业务的角度上进行划分,例如一个用户类包含以下信息
若是调用此类的操作都需要返回所有数据信息,则是符合SRP,若是有大部分的类只需要获取用户地址信息,则可以继续拆分成独立的 UserAddress 类,UserInfo 只保留除 Address 之外的其他信息,拆分之后的两个类的职责更加单一。
2,开闭原则( Open Closed Principle )
OCP应用于模块、类、方法,讲究的是功能的变化不影响结构本身的稳定性。
对扩展开放、对修改关闭。修改关闭并非完全不修改,而是通过较少的修改就是达到功能的添加,多种设计模式都是为了实现这个原则,例如:工厂设计模式,策略模式,观察者模式等
3,里式替换原则( Liskov Substitution Principle )
LSP应用于类,讲究子类完美继承父类
子类可以重写父类的方法,但是不能改变父类的原则。例如父类有一个根据id排列的方法。子类重写父类的方法时,就不能把方法改为根据时间来排序。这样的目的是避免“二意性”,提高可读性,使阅读代码的人不会感觉模棱两可,父类一套,子类一套,到底应该读哪种。也蕴含着开闭原则的道理,可以扩展,不要修改
4, 接口隔离原则( Interface Segregation Principle )
ISP应用于接口,函数,讲究的是调用者调用的接口,函数不要包含不需要的东西
ISP与单一职责很相似,都是为了职责单一,粒度小。
区别在于ISP面向的是调用者,面向的是接口,目的是低耦合;单一职责面向的是自身,面向的是类或接口,目的是高内聚,低耦合;
5,依赖倒置原则( Dependency Inversion Principle )
DIP应用于模块,讲究的是调用者与被调用者执行依赖抽象而不依赖具体细节
低层次模块(被调用者)提供的接口要足够的抽象、通用(基于接口而非实现编程),在设计时需要考虑高层次模块的使用种类和场景。
明明是高层次模块要使用低层次模块,对低层次模块有依赖性。现在反而低层次模块需要根据高层次模块来设计,出现了「倒置」的显现。
这样设计好处有两点:
1. 低层次模块更加通用,适用性更广
2. 高层次模块没有依赖低层次模块的具体实现,方便低层次模块的替换
参考:设计模式之美
网友评论