单一职责原则

This commit is contained in:
2018-09-22 11:30:57 +08:00
parent a79acaa570
commit b49260ae47
10 changed files with 254 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
package top.fjy8018.designpattern.principle.singleresponsibility.after;
import lombok.extern.slf4j.Slf4j;
/**
* 课程实现类
* 接口实现单一职责后可以通过实现类多重实现的方式组合
*
* @author F嘉阳
* @date 2018-09-22 10:46
*/
@Slf4j
public class CourseImpl implements CourseInfo, CourseManagement {
@Override
public String getCourseName() {
return "设计模式课程";
}
@Override
public byte[] getCourseVideo() {
return new byte[0];
}
@Override
public void paid() {
log.info("支付成功");
}
@Override
public void studyCourse() {
log.info("学习课程");
}
}

View File

@@ -0,0 +1,14 @@
package top.fjy8018.designpattern.principle.singleresponsibility.after;
/**
* 一个接口变更,只对一个实现类有影响,对其他接口无关
* 只承担课程信息相关职责
*
* @author F嘉阳
* @date 2018-09-22 10:45
*/
public interface CourseInfo {
String getCourseName();
byte[] getCourseVideo();
}

View File

@@ -0,0 +1,13 @@
package top.fjy8018.designpattern.principle.singleresponsibility.after;
/**
* 只承担课程管理相关职责
*
* @author F嘉阳
* @date 2018-09-22 10:46
*/
public interface CourseManagement {
void paid();
void studyCourse();
}

View File

@@ -0,0 +1,16 @@
package top.fjy8018.designpattern.principle.singleresponsibility.after;
import lombok.extern.slf4j.Slf4j;
/**
* 当前类只承担一个职责:飞
*
* @author F嘉阳
* @date 2018-09-22 10:40
*/
@Slf4j
public class FlyBird {
public void mainMoveMode(String name) {
log.info("{}用翅膀飞", name);
}
}

View File

@@ -0,0 +1,45 @@
package top.fjy8018.designpattern.principle.singleresponsibility.after;
/**
* 方法单一职责
*
* @author F嘉阳
* @date 2018-09-22 10:57
*/
public class Method {
private String name;
private Integer age;
/**
* 此时该方法承担一个职责:更新名字
*
* @param name
*/
public void updateUserName(String name) {
this.name = name;
}
/**
* 只更新年龄
*
* @param age
*/
public void updateUserAge(Integer age) {
this.age = age;
}
/**
* 对于有布尔值的方法也建议拆分
*
* @param name
* @param bool
*/
public void updateProperties(String name, boolean bool) {
if (bool) {
// TODO
} else {
// TODO
}
this.name = name;
}
}

View File

@@ -0,0 +1,16 @@
package top.fjy8018.designpattern.principle.singleresponsibility.after;
import lombok.extern.slf4j.Slf4j;
/**
* 当前类只承担一个职责:走
*
* @author F嘉阳
* @date 2018-09-22 10:40
*/
@Slf4j
public class WalkBird {
public void mainMoveMode(String name) {
log.info("{}用脚走", name);
}
}

View File

@@ -0,0 +1,27 @@
package top.fjy8018.designpattern.principle.singleresponsibility.before;
import lombok.extern.slf4j.Slf4j;
/**
* 单一职责:一个类应该只有一个发生变化的原因
*
* @author F嘉阳
* @date 2018-09-22 10:35
*/
@Slf4j
public class Bird {
/**
* 当前类有两个职责:走和飞
* 没有使用单一职责当业务变更必须修改代码,带来风险
*
* @param name
*/
public void mainMoveMode(String name) {
if ("鸵鸟".equals(name)) {
log.info("{}用脚走", name);
} else {
log.info("{}用翅膀飞", name);
}
// 当边界值越来越多(承担更多职责)的时候变更变得更加困难
}
}

View File

@@ -0,0 +1,33 @@
package top.fjy8018.designpattern.principle.singleresponsibility.before;
/**
* 方法单一职责
*
* @author F嘉阳
* @date 2018-09-22 10:57
*/
public class Method {
private String name;
private Integer age;
/**
* 此时该方法承担两个职责:更新名字和年龄
*
* @param name
* @param age
*/
public void updateUserInfo(String name, Integer age) {
this.name = name;
this.age = age;
}
/**
* 承担多个职责,同时包含可变参数,即不一定更新哪些属性
*
* @param name
* @param properties
*/
public void updateProperties(String name, String... properties) {
// TODO 更新用户名和属性
}
}

View File

@@ -0,0 +1,24 @@
package top.fjy8018.designpattern.principle.singleresponsibility.before;
/**
* 接口单一职责
* 当前接口承担多个职责
*
* @author F嘉阳
* @date 2018-09-22 10:43
*/
public interface SCourse {
/**
* 课程信息相关职责
*/
String getCourseName();
byte[] getCourseVideo();
/**
* 课程管理相关职责
*/
void paid();
void studyCourse();
}

View File

@@ -0,0 +1,33 @@
package top.fjy8018.designpattern.principle.singleresponsibility.before;
import org.junit.jupiter.api.Test;
import top.fjy8018.designpattern.principle.singleresponsibility.after.FlyBird;
import top.fjy8018.designpattern.principle.singleresponsibility.after.WalkBird;
import static org.junit.jupiter.api.Assertions.*;
class BirdTest {
/**
* 没有使用单一职责情况
*/
@Test
void mainMoveModeBefore() {
Bird bird = new Bird();
bird.mainMoveMode("大雁");
// 业务变更
bird.mainMoveMode("鸵鸟");
}
/**
* 使用单一职责后
* 不同职责调用交由应用层负责
*/
@Test
void mainMoveModeAfter() {
FlyBird flyBird = new FlyBird();
flyBird.mainMoveMode("大雁");
WalkBird walkBird = new WalkBird();
walkBird.mainMoveMode("鸵鸟");
}
}