一、概念
1、定义:
- 不要存在多于一个导致类变更的原因
2、简单理解定义:
- 一个类、接口、方法只负责一项职责
3、优点:
- 降低类的复杂度、提高类的可读性,提高系统的可维护性、降低变更引起的风险。
1、示例1:
- 没使用针对类级别的单一职责。
(1)、定义一个鸟类
package com.rf.rules.singleResponsibility;
/**
* @description: 鸟类
* @author: xiaozhi
* @create: 2020-05-03 22:32
*/
public class Bird {
//鸟的移动方式方法
public void MoveMethod(String birdName){
if(birdName.equals("喜鹊")){
System.out.println(birdName+"用翅膀飞");
}else{
System.out.println(birdName+"用脚走");
}
}
}
(2)、定义一个测试类
package com.rf.rules.singleResponsibility;
/**
* @description: 测试类
* @author: xiaozhi
* @create: 2020-05-03 22:33
*/
public class Test {
public static void main(String[] args) {
Bird bird=new Bird();
bird.MoveMethod("喜鹊");
bird.MoveMethod("鸵鸟");
}
}
(3)、输出结果如下:
- 使用针对类级别的单一职责
(1)、定义一个会飞的鸟类
package com.rf.rules.singleResponsibility;
/**
* @description: 会飞的鸟类
* @author: xiaozhi
* @create: 2020-05-03 22:37
*/
public class FlyBird {
//会飞的鸟的方法
public void FlyMethod(String birdName){
System.out.println(birdName+"用翅膀飞");
}
}
(2)、定义一个只会行走的鸟类
package com.rf.rules.singleResponsibility;
/**
* @description: 走路的鸟
* @author: xiaozhi
* @create: 2020-05-03 22:38
*/
public class WalkBird {
//只能行走的鸟的方法
public void walkBird(String birdName){
System.out.println(birdName+"用脚走");
}
}
(3)、定义一个测试类
package com.rf.rules.singleResponsibility;
/**
* @description: 测试类
* @author: xiaozhi
* @create: 2020-05-03 22:33
*/
public class Test {
public static void main(String[] args) {
FlyBird flyBird=new FlyBird();
flyBird.FlyMethod("喜鹊");
WalkBird walkBird=new WalkBird();
walkBird.walkBird("鸵鸟");
}
}
(4)输出结果如下: (5)、类图如下:说明FlyBird类和WalkBird类的职责是单一的。
2、示例2:
- 没有用到针对接口的级别的单一职责
(1)、定义一个课程接口类
package com.rf.rules.singleResponsibility;
/**
* @Description: 课程借口类
* @Param:
* @Author: xz
* @return:
* @Date: 2020/5/3 22:59
*/
public interface ICourse {
//获取课程名称方法
void getCourseName();
//获取课程视频方法
void getCourseVideo();
//学习课程方法
void studyCourse();
//退课方法
void backCourse();
}
(2)、课程接口类有2个职责,一个是课程内容职责,一个是课程管理职责
(3)、定义一个课程接口实现类
package com.rf.rules.singleResponsibility;
import javax.swing.*;
/**
* @description: 课程的实现类
* @author: xiaozhi
* @create: 2020-05-03 23:04
*/
public class ICourseImpl implements ICourse {
@Override
public void getCourseName() {
System.out.println("课程名称");
}
@Override
public void getCourseVideo() {
System.out.println("课程视频");
}
@Override
public void studyCourse() {
System.out.println("学习课程");
}
@Override
public void backCourse() {
System.out.println("退还课程");
}
}
(4)、类图如下:说明ICourse 接口职责不是单一的
- 使用针对接口的级别的单一职责
(1)、定义一个课程内容接口
package com.rf.rules.singleResponsibility;
/**
* @Description: 课程内容接口
* @Param:
* @Author: xz
* @return:
* @Date: 2020/5/3 23:14
*/
public interface IcourseContent {
//获取课程名称方法
void getCourseName();
//获取课程视频方法
void getCourseVideo();
}
(2)、定义一个课程管理接口
package com.rf.rules.singleResponsibility;
/**
* @Description: 课程管理接口
* @Param:
* @Author: xz
* @return:
* @Date: 2020/5/3 23:14
*/
public interface IcourseManager {
//学习课程方法
void studyCourse();
//退课方法
void backCourse();
}
(3)、定义一个课程实现类
package com.rf.rules.singleResponsibility;
/**
* @description: 课程实现类
* @author: xiaozhi
* @create: 2020-05-03 23:17
*/
public class CourseImpl implements IcourseContent,IcourseManager{
@Override
public void getCourseName() {
System.out.println("课程名称");
}
@Override
public void getCourseVideo() {
System.out.println("课程视频");
}
@Override
public void studyCourse() {
System.out.println("学习课程");
}
@Override
public void backCourse() {
System.out.println("退还课程");
}
}
(4)、类图如下:说明IcourseContent接口和IcourseManager的职责是单一的 3、示例3
- 不使用针对方法的级别的单一职责 (1)、定义一个更新用户信息类,updateUserInfo方法既要更新用户名称,又要更新用户其他参数。
package com.rf.rules.singleResponsibility;
/**
* @description: 更新用户信息类
* @author: xiaozhi
* @create: 2020-05-03 23:37
*/
public class UpdateUserInfo {
public void updateUserInfo(String usernName,String... prams){
//username 更新用户名称
//prams 更新用户其他信息
}
}
- 使用针对方法的级别的单一职责
(1)、定义一个更新用户信息类,updateUserName方法只负责更新用户名称;updateUserAddress方法只负责更新用户地址;updateUserAge方法只负责更新用户年龄
package com.rf.rules.singleResponsibility;
/**
* @description: 更新用户信息类
* @author: xiaozhi
* @create: 2020-05-03 23:37
*/
public class UpdateUserInfo {
public void updateUserName(String userName){
}
public void updateUserAddress(String userAddress){
}
public void updateUserAge(String userAge){
}
}