`

java 设计模式 - 单一职责原则

 
阅读更多

有时候,开发人员设计接口的时候会有些问题,比如用户的属性和用户的行为被放在一个接口中声明。这就造成了业务对象和业务逻辑被放在了一起,这样就造成了这个接口有两种职责,接口职责不明确,按照SRP的定义就违背了接口的单一职责原则了。

单一职责原则(Single Responsibility Principle),简称SRP。

定义:

There should never be more than one reason for a class to change.

应该有且仅有一个原因引起类的变更。

有时候,开发人员设计接口的时候会有些问题,比如用户的属性和用户的行为被放在一个接口中声明。这就造成了业务对象和业务逻辑被放在了一起,这样就造成了这个接口有两种职责,接口职责不明确,按照SRP的定义就违背了接口的单一职责原则了。

下面是个例子:

  1. package com.loulijun.chapter1;  
  2.    
  3. public interface Itutu {  
  4.     //身高  
  5.     void setShengao(double height);  
  6.     double getShengao();  
  7.     //体重  
  8.     void setTizhong(double weight);  
  9.     double getTizhong();  
  10.     //吃饭  
  11.     boolean chiFan(boolean hungry);  
  12.     //上网  
  13.     boolean shangWang(boolean silly);  

上面的例子就存在这个问题,身高、体重属于业务对象,与之相应的方法主要负责用户的属性。而吃饭、上网是相应的业务逻辑,主要负责用户的行为。但是这就会给人一种不知道这个接口到底是做什么的感觉,职责不清晰,后期维护的时候也会造成各种各样的问题。

解决办法:单一职责原则,将这个接口分解成两个职责不同的接口即可

ItutuBO.java:负责tutu(涂涂,假如是个人名)的属性

  1. package com.loulijun.chapter1;  
  2.    
  3. /**  
  4.  * BO:Bussiness Object,业务对象  
  5.  * 负责用户的属性  
  6.  * @author Administrator  
  7.  *  
  8.  */ 
  9. public interface ItutuBO {  
  10.     //身高  
  11.     void setShengao(double height);  
  12.     double getShengao();  
  13.     //体重  
  14.     void setTizhong(double weight);  
  15.     double getTizhong();  

ItutuBL.java:负责涂涂的行为

  1. package com.loulijun.chapter1;  
  2. /**  
  3.  * BL:Business Logic,业务逻辑  
  4.  * 负责用户的行为  
  5.  * @author Administrator  
  6.  *  
  7.  */ 
  8. public interface ItutuBL {  
  9.     //吃饭  
  10.     boolean chiFan(boolean hungry);  
  11.     //上网  
  12.     boolean shangWang(boolean silly);  

这样就实现了接口的单一职责。那么实现接口的时候,就需要有两个不同的类

TutuBO.java

  1. package com.loulijun.chapter1;  
  2.    
  3. public class TutuBO implements ItutuBO {  
  4.     private double height;  
  5.     private double weight;  
  6.     @Override 
  7.     public double getShengao() {         
  8.         return height;  
  9.     }  
  10.    
  11.     @Override 
  12.     public double getTizhong() {  
  13.         return weight;  
  14.     }  
  15.    
  16.     @Override 
  17.     public void setShengao(double height) {  
  18.         this.height = height;  
  19.     }  
  20.    
  21.     @Override 
  22.     public void setTizhong(double weight) {  
  23.         this.weight = weight;  
  24.     }  
  25.    

TutuBL.java

  1. package com.loulijun.chapter1;  
  2.    
  3. public class TutuBL implements ItutuBL {  
  4.    
  5.     @Override 
  6.     public boolean chiFan(boolean hungry) {  
  7.         if(hungry)  
  8.         {  
  9.             System.out.println("去吃火锅...");  
  10.             return true;  
  11.         }  
  12.         return false;  
  13.     }  
  14.    
  15.     @Override 
  16.     public boolean shangWang(boolean silly) {  
  17.         if(silly)  
  18.         {  
  19.             System.out.println("好无聊啊,上会网...");  
  20.             return true;  
  21.         }  
  22.         return false;  
  23.     }  
  24.    

这样就清晰了,当需要修改用户属性的时候只需要对ItutuBO这个接口来修改,只会影响到TutuBO这个类,不会影响其他类。

那么单一职责原则的意义何在呢?

  1. 降低类的复杂性,实现什么样的职责都有清晰的定义
  2. 提高可读性
  3. 提高可维护性
  4. 降低变更引起的风险,对系统扩展性和维护性很有帮助

但是、使用单一职责原则有一个问题,“职责”没有一个明确的划分标准,如果把职责划分的太细的话会导致接口和实现类的数量剧增,反而提高了复杂度,降低了代码的可维护性。所以使用这个职责的时候还要具体情况具体分析。建议就是接口一定要采用单一职责原则,实现类的设计上尽可能做到单一职责原则,最好是一个原因引起一个类的变化。

原文链接:http://www.cnblogs.com/loulijun/archive/2012/03/03/2378642.html

分享到:
评论

相关推荐

    Java设计模式中单一职责原则详解.rar

    Java设计模式中单一职责原则详解.rar

    设计模式6大原则:单一职责原则

    设计模式6大原则:单一职责原则

    Java设计模式-面向对象七大设计原则

    例如:随着计算机的不断发展,程序学习这门技术也越来越重要,很多人都开启了...面向对象设计原则一共有七个:开闭原则、里氏替换原则、依赖倒转原则、单一职责原则、接口隔离原则、组合/聚合复用原则、迪米特法则。

    单一职责原则

    在架构中体验设计模式和算法之美 Java设计原则 单一职责原则

    JAVA设计模式六大原则详细讲解(面向对象语言通用)

    1.单一职责原则: 不要存在多于一个导致类变更的原因 2.里氏替换法则:子类可以扩展父类的功能,但不能改变父类原有的功能 3.依赖倒置原则:面向接口编程 4.接口隔离原则: 客户端不应该依赖它不需要的接口;一个类对...

    简单讲解Java设计模式编程中的单一职责原则

    主要介绍了Java设计模式编程中的单一职责原则,这在团队开发编写接口时经常使用这样的约定,需要的朋友可以参考下

    java与模式源码-DesignPatterns:关于java设计模式,源码与解析

    单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因。 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计...

    java设计模式

    第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 第2章 里氏替换原则 2.1 爱恨纠葛的父子关系 2.2 纠纷不断,规则压制 2.3 最佳实践 第3...

    Java设计模式(2.78G)

    课程目标:掌握7个设计原则,掌握UML建模,掌握常用设计模式,了解其他设计模式,Java设计模式,本教程可以帮助你服务项目,优化项目,实现程序的高效运行。〖课程目录〗:源码详情+=','+15783;2019Java设计模式...

    设计模式之六大原则详解,Markdown笔记

    详细介绍了设计模式六大原则,配有示例代码和图片,有开闭原则,单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则等等。

    1.java基础数据结构 2.java基础算法 3.java设计模式.rar

    大神详解,这么详细的Java设计模式不收藏可惜了 设计模式是很多程序员总结出来的优秀实践。曾经在刚开始写项目的时候学习过设计模式,在开发过程中,也主动或者被动的使用过。现在写代码虽说不会特意明确在用哪种...

    design-pattern-java.pdf

    基础知识 基础知识设计模式概述 从招式与内功谈起——设计模式概述(一) 从招式与内功谈起——设计模式概述(二) 从招式与内功谈起——设计模式概述(三) 面向对象设计原则 面向对象设计原则之单一职责原则 面向...

    全新150集通俗易懂的Java设计模式

    本教程为授权出品教程 ...授课采用 图解+框架源码分析的方式1) 内容包括:设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和

    尚硅谷设计模式源码笔记课件.zip

    1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种...

    java餐饮管理系统源码-pattern:设计模式扫盲,以身边故事来讲解设计模式

    3.单一职责原则 4.接口隔离原则 5.迪米特法则 6.里氏替换原则 7.合成复用原则 创建型 单例模式 工厂模式 原型模式 建造者模式 结构型 代理模式 适配器模式 桥接模式 装饰模式 外观模式 享元模式 组合模式 行为型 ...

    【Java学习+面试宝典】 一份涵盖大部分Java程序员所需要掌握的核心知识

    【Java学习+面试宝典】 一份涵盖大部分Java程序员所需要掌握的核心知识。 目录: Java 面试题 文章推荐 ...从零开始单排学设计模式「单一职责原则」黑铁 - 青铜 晋级赛 学习书籍: Java 技术书籍大全

    图解Java设计模式(一)

    1) 优秀的程序应该是这样...授课采用 图解+框架源码分析的方式1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚

    java版五子棋源码-java_design_pattern:图解Java设计模式

    java版五子棋源码 ...单一职责原则 接口隔离原则 依赖倒转(倒置)原则 里氏替换原则 开闭原则 迪米特法则 合成复用原则 1.1.单一职责原则 1.1.1.基本介绍 一个类只应负责一项职责。 1.1.2.应用实例 package ...

    Java面向对象程序设计杨晓燕面向对象基本原则和模式.pptx

    单一职责原则和最少知识原则 最少知识原则(Least Knowledge Principle, 简称为LKP)又叫迪米特法则(Law of Demeter,简写为LoD),就是说一个对象应当对其他对象有尽可能少的了解。就像我国古代老子所说的"使民...

    java8源码-DesignModePrimary:设计模式初探

    采用单一职责 将图片缓存 及图片加载拆分, 采用里氏替换 将图片三级缓存抽取为接口,子类可自由实现 采用接口隔离原则, 将读写流 实现的Closeable 接口 统一抽出 Thanks 感谢Android源码设计模式相关作者

Global site tag (gtag.js) - Google Analytics