git 位址:https://github.com/Zs-xiazhi/pattern
1.單一職責原則(Single Responsibility Principle)(SRP)
單一職責的定義為: 一個類應該有且隻有一個原因引起類的變化
此原則的核心是:解耦和增強内聚性
首先我們來看一個類設計:
人有姓名,年齡,性别等屬性,也有吃飯睡覺等行為,依此建立一個類:
git 位址:https://github.com/Zs-xiazhi/pattern
人有姓名,年齡,性别等屬性,也有吃飯睡覺等行為,依此建立一個類:
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.類的變更風險降低了,原來有兩個變化可能導緻類的結構發生變化,現在每個類的職責都明确了,每一個變化都有相應的變更類,也就是隻有一個原因引起類的變化`