我们在做面向对象设计和开发(OOD和OOP)的时候,最底层的基石是6大设计原则。GoF的23种设计模式以及新生代设计模式的扩展(如:MVC和AOP),其本职都是至此延伸。这6大设计原则,最终目的是开闭原则,方便进行扩展和维护。在面向对象语言中,使用其特性(封装、继承、多态)进行表现,也加入聚合和组合。
6大设计原则罗列如下:
1、单一职责原则;
2、里氏替换原则;
3、依赖倒置原则;
4、接口隔离原则;
5、迪米特法则;
6、开闭原则(最终目的);
单一职责原则,英文名为Single Responsibility Principle,简称SRP。在最开始学面向对象的时候,我们常常将很多功能揉和到一个类里面。我们在做组织机构架构的时候,设计人员类的时候,我们能想到的最简单的类图如下:
类图是非常简单的,但是我们也很容易发现其中的问题,用户信息和用户操作耦合在一起了。很明显,我们可以进行更细致的功能划分,用户信息可以抽象成一个BO(Business Object),用户操作可以抽象成一个Biz(Business Logic)。这样我们设计的类图如下:
这样,职责细分之后的代码如下:
UserBO user = new UserInfo(); user.setId(id); user.setName(name); ... UserBiz biz = (UserBiz)user; biz.changePwd("123");
确实可以如此实现,但是回头我们来想一想为什么要将一个接口拆分成2个接口呢?单一职责嘛,每个接口的职责是不一样的。那为什么又要在UserInfo中进行实现呢?这不是将其耦合在一起了吗?的确如此,这儿我们可以考虑使用聚合/组合的方式来进行更合理的设计,类图如下:
上面是依据单一职责原则将一个接口拆分成2个接口,那么究竟什么是单一职责原则呢?其定义是:应该有且仅有一个原因引起类的变更。