From b49260ae47f2a4c90de042cefd0d241d1e894d77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Sat, 22 Sep 2018 11:30:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E4=B8=80=E8=81=8C=E8=B4=A3=E5=8E=9F?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../after/CourseImpl.java | 33 ++++++++++++++ .../after/CourseInfo.java | 14 ++++++ .../after/CourseManagement.java | 13 ++++++ .../singleresponsibility/after/FlyBird.java | 16 +++++++ .../singleresponsibility/after/Method.java | 45 +++++++++++++++++++ .../singleresponsibility/after/WalkBird.java | 16 +++++++ .../singleresponsibility/before/Bird.java | 27 +++++++++++ .../singleresponsibility/before/Method.java | 33 ++++++++++++++ .../singleresponsibility/before/SCourse.java | 24 ++++++++++ .../singleresponsibility/before/BirdTest.java | 33 ++++++++++++++ 10 files changed, 254 insertions(+) create mode 100644 src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/CourseImpl.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/CourseInfo.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/CourseManagement.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/FlyBird.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/Method.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/WalkBird.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/before/Bird.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/before/Method.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/before/SCourse.java create mode 100644 src/test/java/top/fjy8018/designpattern/principle/singleresponsibility/before/BirdTest.java diff --git a/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/CourseImpl.java b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/CourseImpl.java new file mode 100644 index 0000000..2881aa7 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/CourseImpl.java @@ -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("学习课程"); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/CourseInfo.java b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/CourseInfo.java new file mode 100644 index 0000000..ad45d0e --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/CourseInfo.java @@ -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(); +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/CourseManagement.java b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/CourseManagement.java new file mode 100644 index 0000000..89eb69a --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/CourseManagement.java @@ -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(); +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/FlyBird.java b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/FlyBird.java new file mode 100644 index 0000000..8ca8da7 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/FlyBird.java @@ -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); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/Method.java b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/Method.java new file mode 100644 index 0000000..1b447c8 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/Method.java @@ -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; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/WalkBird.java b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/WalkBird.java new file mode 100644 index 0000000..5c28b1e --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/after/WalkBird.java @@ -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); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/before/Bird.java b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/before/Bird.java new file mode 100644 index 0000000..547b9c2 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/before/Bird.java @@ -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); + } + // 当边界值越来越多(承担更多职责)的时候变更变得更加困难 + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/before/Method.java b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/before/Method.java new file mode 100644 index 0000000..971b6a3 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/before/Method.java @@ -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 更新用户名和属性 + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/before/SCourse.java b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/before/SCourse.java new file mode 100644 index 0000000..edb26a7 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/singleresponsibility/before/SCourse.java @@ -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(); +} diff --git a/src/test/java/top/fjy8018/designpattern/principle/singleresponsibility/before/BirdTest.java b/src/test/java/top/fjy8018/designpattern/principle/singleresponsibility/before/BirdTest.java new file mode 100644 index 0000000..22bc1e2 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/principle/singleresponsibility/before/BirdTest.java @@ -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("鸵鸟"); + } +} \ No newline at end of file