有时候,开发人员设计接口的时候会有些问题,比如用户的属性和用户的行为被放在一个接口中声明。这就造成了业务对象和业务逻辑被放在了一起,这样就造成了这个接口有两种职责,接口职责不明确,按照SRP的定义就违背了接口的单一职责原则了。
单一职责原则(Single Responsibility Principle),简称SRP。
定义:
There should never be more than one reason for a class to change.
应该有且仅有一个原因引起类的变更。
有时候,开发人员设计接口的时候会有些问题,比如用户的属性和用户的行为被放在一个接口中声明。这就造成了业务对象和业务逻辑被放在了一起,这样就造成了这个接口有两种职责,接口职责不明确,按照SRP的定义就违背了接口的单一职责原则了。
下面是个例子:
- package com.loulijun.chapter1;
- public interface Itutu {
- //身高
- void setShengao(double height);
- double getShengao();
- //体重
- void setTizhong(double weight);
- double getTizhong();
- //吃饭
- boolean chiFan(boolean hungry);
- //上网
- boolean shangWang(boolean silly);
- }
上面的例子就存在这个问题,身高、体重属于业务对象,与之相应的方法主要负责用户的属性。而吃饭、上网是相应的业务逻辑,主要负责用户的行为。但是这就会给人一种不知道这个接口到底是做什么的感觉,职责不清晰,后期维护的时候也会造成各种各样的问题。
解决办法:单一职责原则,将这个接口分解成两个职责不同的接口即可
ItutuBO.java:负责tutu(涂涂,假如是个人名)的属性
- package com.loulijun.chapter1;
- /**
- * BO:Bussiness Object,业务对象
- * 负责用户的属性
- * @author Administrator
- *
- */
- public interface ItutuBO {
- //身高
- void setShengao(double height);
- double getShengao();
- //体重
- void setTizhong(double weight);
- double getTizhong();
- }
ItutuBL.java:负责涂涂的行为
- package com.loulijun.chapter1;
- /**
- * BL:Business Logic,业务逻辑
- * 负责用户的行为
- * @author Administrator
- *
- */
- public interface ItutuBL {
- //吃饭
- boolean chiFan(boolean hungry);
- //上网
- boolean shangWang(boolean silly);
- }
这样就实现了接口的单一职责。那么实现接口的时候,就需要有两个不同的类
TutuBO.java
- package com.loulijun.chapter1;
- public class TutuBO implements ItutuBO {
- private double height;
- private double weight;
- @Override
- public double getShengao() {
- return height;
- }
- @Override
- public double getTizhong() {
- return weight;
- }
- @Override
- public void setShengao(double height) {
- this.height = height;
- }
- @Override
- public void setTizhong(double weight) {
- this.weight = weight;
- }
- }
TutuBL.java
- package com.loulijun.chapter1;
- public class TutuBL implements ItutuBL {
- @Override
- public boolean chiFan(boolean hungry) {
- if(hungry)
- {
- System.out.println("去吃火锅...");
- return true;
- }
- return false;
- }
- @Override
- public boolean shangWang(boolean silly) {
- if(silly)
- {
- System.out.println("好无聊啊,上会网...");
- return true;
- }
- return false;
- }
- }
这样就清晰了,当需要修改用户属性的时候只需要对ItutuBO这个接口来修改,只会影响到TutuBO这个类,不会影响其他类。
那么单一职责原则的意义何在呢?
- 降低类的复杂性,实现什么样的职责都有清晰的定义
- 提高可读性
- 提高可维护性
- 降低变更引起的风险,对系统扩展性和维护性很有帮助
但是、使用单一职责原则有一个问题,“职责”没有一个明确的划分标准,如果把职责划分的太细的话会导致接口和实现类的数量剧增,反而提高了复杂度,降低了代码的可维护性。所以使用这个职责的时候还要具体情况具体分析。建议就是接口一定要采用单一职责原则,实现类的设计上尽可能做到单一职责原则,最好是一个原因引起一个类的变化。
原文链接:http://www.cnblogs.com/loulijun/archive/2012/03/03/2378642.html
相关推荐
Java设计模式中单一职责原则详解.rar
设计模式6大原则:单一职责原则
例如:随着计算机的不断发展,程序学习这门技术也越来越重要,很多人都开启了...面向对象设计原则一共有七个:开闭原则、里氏替换原则、依赖倒转原则、单一职责原则、接口隔离原则、组合/聚合复用原则、迪米特法则。
在架构中体验设计模式和算法之美 Java设计原则 单一职责原则
1.单一职责原则: 不要存在多于一个导致类变更的原因 2.里氏替换法则:子类可以扩展父类的功能,但不能改变父类原有的功能 3.依赖倒置原则:面向接口编程 4.接口隔离原则: 客户端不应该依赖它不需要的接口;一个类对...
主要介绍了Java设计模式编程中的单一职责原则,这在团队开发编写接口时经常使用这样的约定,需要的朋友可以参考下
单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因。 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计...
第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 第2章 里氏替换原则 2.1 爱恨纠葛的父子关系 2.2 纠纷不断,规则压制 2.3 最佳实践 第3...
课程目标:掌握7个设计原则,掌握UML建模,掌握常用设计模式,了解其他设计模式,Java设计模式,本教程可以帮助你服务项目,优化项目,实现程序的高效运行。〖课程目录〗:源码详情+=','+15783;2019Java设计模式...
详细介绍了设计模式六大原则,配有示例代码和图片,有开闭原则,单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则等等。
大神详解,这么详细的Java设计模式不收藏可惜了 设计模式是很多程序员总结出来的优秀实践。曾经在刚开始写项目的时候学习过设计模式,在开发过程中,也主动或者被动的使用过。现在写代码虽说不会特意明确在用哪种...
基础知识 基础知识设计模式概述 从招式与内功谈起——设计模式概述(一) 从招式与内功谈起——设计模式概述(二) 从招式与内功谈起——设计模式概述(三) 面向对象设计原则 面向对象设计原则之单一职责原则 面向...
本教程为授权出品教程 ...授课采用 图解+框架源码分析的方式1) 内容包括:设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和
1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种...
3.单一职责原则 4.接口隔离原则 5.迪米特法则 6.里氏替换原则 7.合成复用原则 创建型 单例模式 工厂模式 原型模式 建造者模式 结构型 代理模式 适配器模式 桥接模式 装饰模式 外观模式 享元模式 组合模式 行为型 ...
【Java学习+面试宝典】 一份涵盖大部分Java程序员所需要掌握的核心知识。 目录: Java 面试题 文章推荐 ...从零开始单排学设计模式「单一职责原则」黑铁 - 青铜 晋级赛 学习书籍: Java 技术书籍大全
1) 优秀的程序应该是这样...授课采用 图解+框架源码分析的方式1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚
java版五子棋源码 ...单一职责原则 接口隔离原则 依赖倒转(倒置)原则 里氏替换原则 开闭原则 迪米特法则 合成复用原则 1.1.单一职责原则 1.1.1.基本介绍 一个类只应负责一项职责。 1.1.2.应用实例 package ...
单一职责原则和最少知识原则 最少知识原则(Least Knowledge Principle, 简称为LKP)又叫迪米特法则(Law of Demeter,简写为LoD),就是说一个对象应当对其他对象有尽可能少的了解。就像我国古代老子所说的"使民...
采用单一职责 将图片缓存 及图片加载拆分, 采用里氏替换 将图片三级缓存抽取为接口,子类可自由实现 采用接口隔离原则, 将读写流 实现的Closeable 接口 统一抽出 Thanks 感谢Android源码设计模式相关作者