单一职责原则
This commit is contained in:
@@ -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("学习课程");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
// 当边界值越来越多(承担更多职责)的时候变更变得更加困难
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 更新用户名和属性
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
@@ -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("鸵鸟");
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user