六大设计原则-单一职责原则

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.类的变更风险降低了,原来有两个变化可能导致类的结构发生变化,现在每个类的职责都明确了,每一个变化都有相应的变更类,也就是只有一个原因引起类的变化`
原文地址:https://www.cnblogs.com/Zs-book1/p/12713974.html