面向对象的7种设计原则(1)-单一职责原则


永远不要让一个类存在多个改变的理由。

单一原则表明,如果你有多个原因去改变一个类,那么应该把这些引起变化的原因分离开,把这个类分成多个类,每个类只负责处理一种改变。当你做出某种改变时,只需要修改负责处理该改变的类。当我们去改变一个具有多个职责的类时可能会影响该类的其他功能

单一职责原则代表了设计应用程序时一种很好的识别类的方式,并且它提醒你思考一个类的所有演化方式。只有对应用程序的工作方式有了很好的理解,才能很好的分离职责。

单一职责原则原则的核心含意是:只能让一个类/接口/方法有且仅有一个职责。

案例:

public class Animal {
    public void run(String animal){
        System.out.println(animal+"running on the land...");
    }
     public static void main(String[] args) {
        Animal animal = new Animal();
        animal.run("狗");
        animal.run("牛");
        animal.run("马");
    }
}

运行结果:

狗running on the land...
牛running on the land...
马running on the land...

然而并不是所有的动物都在陆地上奔跑,鸟在天上飞,鱼在水中游。这时的Animal类就不符合单一职责,需要将Animal进行细分。

第一种:

    class Aquatic{
        public void run(String animal){
            System.out.println(animal+"swimming in the water...");
        }
    }

    class Terrestrial{
        public void run(String animal){
            System.out.println(animal+"running on the land...");
        }
    }

    class Birds{
        public void run(String animal){
            System.out.println(animal+"flying in the sky...");
        }
    }

第二种:

这种修改方式直接在代码级别上违背了单一职责原则,虽然修改起来最简单,但隐患却是最大的。

public class Animal {

    public void run(String animal){
        if("fish".equals(animal)){
            System.out.println(animal+"swimming in the water...");
        }else if("bird".equals(animal)){
            System.out.println(animal+"flying in the sky...");
        }else{
            System.out.println(animal+"running on land...");
        }
    }
}

第三种:

这种修改方式没有改动原来的方法,而是在类中新加了一个方法,这样虽然也违背了单一职责原则,但在方法级别上却是符合单一职责原则的,因为它并没有动原来方法的代码。

public class Animal {

    public void run1(String animal){
            System.out.println(animal+"running on land...");
    }

    public void run2(String animal){
        System.out.println(animal+"flying in the sky...");
    }

    public void run3(String animal){
        System.out.println(animal+"swimming in the water...");
    }
}

单一职责原则虽然它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。


文章作者: 少年闰土
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 少年闰土 !
评论
 上一篇
面向对象的7种设计原则(2)-接口隔离原则 面向对象的7种设计原则(2)-接口隔离原则
定义Interface Segregation Principle 客户端不应依赖它不需要的接口 类间的依赖关系应该建立在最小的接口上 其实通俗来理解就是,不要在一个接口里面放很多的方法,这样会显得这个类很臃肿。接口应该尽量细化,一
2020-07-01
下一篇 
Spring事务隔离级别 Spring事务隔离级别
事务隔离级别ISOLATION_DEFAULT这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。 ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许令
2020-06-23
  目录