一个好的设计模式要符合面向对象设计原则

面向对象的设计原则有有以下7个原则
1.单一职责原则
2.开闭原则
3.里氏代换原则
4.依赖倒原则
5.接口隔离原则
6.合成复用原则
7.迪米特原则
其中最重要的是开闭原则

1.单一职责原则
单一职责原则的意思就是一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中,其实这个东西比较抽象

举个例子
设计模式(二).面向对象设计原则(上)

在上面代码中我定义了一个学生类,但这个类符不符合单一职责原则呢?
很明显它不符合。首先第一点在这个学生类里,有打印学校信息的方法,这明显是不合理的,因为学生类的职责就是有关学生的东西,跟学校明显没有关系。

其次还有一个点就是很多人以为printStudentInformation()这个方法定义在学生类里是合理的,但是这里我们需要仔细反着想一下,在一个项目中我们会只定义一个学生对象吗?很明显不可能的。既然不止一个学生对象,那么printStudentInformation()打印学生信息这个方法的入口就不止一个,只要有学生对象,就都可以使用这个方法。那么要这么多入口完全是没必要的,所以printStudentInformation()不能定义在学生类里,那么这个方法应该定义在哪里呢?
设计模式(二).面向对象设计原则(上)
这里我们可以定义一个学生服务类StudentService,它的单一职责就是为学生服务,printStudentInformation()就可以写在这个类里,那么此时它的入口就只有一个,因为我们这个项目中不需要创建多个学生服务对象,只要一个就可以了,此时它的入口就是单一的。

其实最常见的单一职责原则的例子就是service层,dao层,DButil。service层的职责就是服务,而dao层的职责就是对数据库进行操作,而DButil则是连接数据库,service层调用dao层,而dao层要对数据库进行操作就得先连接数据库,所以dao层调用DButil来连数据库

其实很多时候,当我们不能确定某个方法是否定义在一个类里时,我们都可以用单一入口的想法反着想

2.开闭原则
开闭原则就是对外扩展开放,对修改关闭

简单来说就是,我们写好一段程序,当有新的需求来时,我们要做的只是增加代码,而不能修改已经写好的代码

举个例子
设计模式(二).面向对象设计原则(上)
有一个打印类Myprinter,我要打印学生的编号和姓名,传参得时候我直接传学生类(Student)的参数即可,现在,客户增加了一个需求,要求打印老师的信息。那么像上面这样的写法就满足开闭原则。因为客户增加了需求,而我们并不需要修改已经写好的代码,只需要在增加一段代码即可,增加的代码如下
设计模式(二).面向对象设计原则(上)
现在要打印老师的信息。传参的时候直接传老师类(Teacher)的参数即可,同理无论客户增加什么样的打印需求,我们只需要创建一个继承PrintObj的类,然后重写里面的方法即可,根本不需要更改已经写好的代码,这就满足了“只扩展,不修改”的原则

3.里氏代换原则
里氏代换原则就是,所以引用基类的地方必须能透明的使用其子类的对象

简单来说就是,当定义一个属性的时候尽可能使用父类来定义
实际上里氏代换原则是开闭原则实现的基础,参考上面2中的那个例子,其实就能发现它是满足里氏代换原则的

相关文章: