天天看點

六大設計原則-單一職責原則

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.類的變更風險降低了,原來有兩個變化可能導緻類的結構發生變化,現在每個類的職責都明确了,每一個變化都有相應的變更類,也就是隻有一個原因引起類的變化`