git 地址:https://github.com/Zs-xiazhi/pattern
1.单一职责原则(Single Responsibility Principle)(SRP)
单一职责的定义为: 一个类应该有且只有一个原因引起类的变化
此原则的核心是:解耦和增强内聚性
首先我们来看一个类设计:
人有姓名,年龄,性别等属性,也有吃饭睡觉等行为,依此创建一个类:
package com.xiazhi.principle.srp;
/**
* @author ZhaoShuai
* @date Create in 2020/4/12
**/
public class Person {
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 性别:1-男,0-女
*/
private Integer gander;
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getGander() {
return gander;
}
public void setGander(Integer gander) {
this.gander = gander;
}
}
可以看到人的属性和行为都放在一个类里面,如果此时要添加一个属性或者添加一个学习的行为,都会导致这个类的结构改变,这个类的职责既要维护人的属性,又要维护人的行为,因此就有两个职责,不符合职责单一性原则。
当然,这样写也没有问题,但是会导致类的职责不明确,为后期维护带来困难。因此将这个类进行拆分:
/**
* 人的属性
* @author ZhaoShuai
* @date Create in 2020/4/12
**/
public class PersonProperty {
private String name;
private Integer age;
private Integer gander;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getGander() {
return gander;
}
public void setGander(Integer gander) {
this.gander = gander;
}
}
/**
* 人的行为
* @author ZhaoShuai
* @date Create in 2020/4/12
**/
public interface PersonAction {
void sleep();
void eat();
}
public class PersonInstance implements PersonAction {
private PersonProperty person;
@Override
public void sleep() {
System.out.println(this.person.getName() + "吃饭");
}
@Override
public void eat() {
System.out.println(this.person.getName() + "睡觉");
}
public PersonProperty getPerson() {
return person;
}
public void setPerson(PersonProperty person) {
this.person = person;
}
}
PersonInstance实体实现了行为的接口,而他的内部则有一个PersonProperty的字段。当Person需要添加一个新的属性如:学历等,只需要更改PersonProperty类就可以了,与其他的
类无关,其他的类都务需改动,当需要添加新的行为,如:学习时,只需要改变接口及他的实现类,而务需其他的改动。这样就实现了类的职责单一化。
通过上面的例子来分析下,职责单一性的好处:
- `1.类的复杂性降低了`
- `2.负责性降低了,类的可阅读性自然提高了`
- `3.可阅读性提高了,那么可维护性自然就提高了`
- `4.类的变更风险降低了,原来有两个变化可能导致类的结构发生变化,现在每个类的职责都明确了,每一个变化都有相应的变更类,也就是只有一个原因引起类的变化`