diff --git a/dev-protocol-design-pattern/README.md b/dev-protocol-design-pattern/README.md
index bc29f79..a4cbbec 100644
--- a/dev-protocol-design-pattern/README.md
+++ b/dev-protocol-design-pattern/README.md
@@ -113,6 +113,51 @@
---
### 单例模式
+
+#### 1 定义与类型
+ 定义:保证一个类仅有一个实例,并提供一个全局访问点
+ 类型:创建型
+#### 2 适用场景
+ 想确保任何情况下都绝对只有一个实例
+#### 3 优点
+ 在内存里只有一个实例,减少了内存开销
+ 可以避免对资源的多重占用
+ 设置了全局访问点,严格控制访问
+#### 4 缺点
+ 没有接口,扩展困难
+#### 5 重点
+ 私有构造器
+ 线程安全
+ 延迟加载
+ 序列化和反序列化安全
+ 反射
+#### 6 单例模式相关的设计模式
+ 单例模式和工厂模式
+ - 可以把工厂类设计为单例的
+ 单例模式和享元模式
+ - 享元模式是单例对象的一个工厂
+#### 7 Coding
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
---
@@ -126,8 +171,38 @@
---
### 外观模式
+#### 1 定义与类型
+ 定义: 又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口
+ 外观模式定义了一个高层接口,让子系统更容易使用
+ 类型: 结构型
+#### 2 使用场景
+ 子系统越来越复杂,增加外观模式提供简单调用接口
+ 构建多层系统结构,利用外观对象作为每层入口,简化层间调用
+#### 3 优点
+ 简化了调用过程,无需了解深入子系统,防止带来风险
+ 减少系统依赖,松散耦合
+ 更好的划分访问层次
+ 符合迪米特法则,即最少知道原则
+
+#### 4 缺点
+ 增加子系统,扩展子系统行为行为很容易引入风险
+ 不符合开闭原则
+
+#### 5 相关的设计模式
+ 外观模式和中介者模式
+ - 外观模式关注是外部和子系统的交互
+ - 中介者模式关注是子系统内部的交互
+ 外观模式和单例模式
+ - 外观模式中的独外观对象做成单例对象使用
+ 外观模式和抽象工厂模式
+ - 外观类可以通过抽象工厂获取子系统的实例
+#### 6 coding
+ com.baiye.design.pattern.structural.facade
+
+
+---
### 装饰者模式
diff --git a/dev-protocol-design-pattern/pic/单例-DoubleCheck.png b/dev-protocol-design-pattern/pic/单例-DoubleCheck.png
new file mode 100644
index 0000000..cd8e3c1
Binary files /dev/null and b/dev-protocol-design-pattern/pic/单例-DoubleCheck.png differ
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/Interpreter.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/Interpreter.java
deleted file mode 100644
index 89a7e1f..0000000
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/Interpreter.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.baiye.design.behavioral.interpreter;
-
-public interface Interpreter {
- int interpret();
-}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Approver.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/Approver.java
similarity index 83%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Approver.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/Approver.java
index 88a35b4..92566e6 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Approver.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/Approver.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.chainofresponsibility;
+package com.baiye.design.pattern.behavioral.chainofresponsibility;
public abstract class Approver {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/ArticleApprover.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/ArticleApprover.java
similarity index 88%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/ArticleApprover.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/ArticleApprover.java
index cb81007..69194ef 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/ArticleApprover.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/ArticleApprover.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.chainofresponsibility;
+package com.baiye.design.pattern.behavioral.chainofresponsibility;
public class ArticleApprover extends Approver{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Course.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/Course.java
similarity index 91%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Course.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/Course.java
index cc9293b..c10fa37 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Course.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/Course.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.chainofresponsibility;
+package com.baiye.design.pattern.behavioral.chainofresponsibility;
public class Course {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/Test.java
similarity index 89%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/Test.java
index aa1c36a..909c07c 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.chainofresponsibility;
+package com.baiye.design.pattern.behavioral.chainofresponsibility;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/VideoApprover.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/VideoApprover.java
similarity index 87%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/VideoApprover.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/VideoApprover.java
index a09957b..e74d773 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/VideoApprover.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/chainofresponsibility/VideoApprover.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.chainofresponsibility;
+package com.baiye.design.pattern.behavioral.chainofresponsibility;
public class VideoApprover extends Approver{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/AddInterpreter.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/AddInterpreter.java
similarity index 90%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/AddInterpreter.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/AddInterpreter.java
index 7842b93..4320c81 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/AddInterpreter.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/AddInterpreter.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.interpreter;
+package com.baiye.design.pattern.behavioral.interpreter;
public class AddInterpreter implements Interpreter {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/Interpreter.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/Interpreter.java
new file mode 100644
index 0000000..cc9d3cf
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/Interpreter.java
@@ -0,0 +1,5 @@
+package com.baiye.design.pattern.behavioral.interpreter;
+
+public interface Interpreter {
+ int interpret();
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/MultiInterpreter.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/MultiInterpreter.java
similarity index 90%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/MultiInterpreter.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/MultiInterpreter.java
index af31507..b727a48 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/MultiInterpreter.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/MultiInterpreter.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.interpreter;
+package com.baiye.design.pattern.behavioral.interpreter;
public class MultiInterpreter implements Interpreter{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/MyExpressionParse.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/MyExpressionParse.java
similarity index 96%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/MyExpressionParse.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/MyExpressionParse.java
index 0e3945d..f1ec63a 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/MyExpressionParse.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/MyExpressionParse.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.interpreter;
+package com.baiye.design.pattern.behavioral.interpreter;
import java.util.Stack;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/NumberInterpreter.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/NumberInterpreter.java
similarity index 87%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/NumberInterpreter.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/NumberInterpreter.java
index d2b93ed..625cff2 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/NumberInterpreter.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/NumberInterpreter.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.interpreter;
+package com.baiye.design.pattern.behavioral.interpreter;
public class NumberInterpreter implements Interpreter{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/OpratorUtil.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/OpratorUtil.java
similarity index 91%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/OpratorUtil.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/OpratorUtil.java
index ccbdf97..0e3e497 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/OpratorUtil.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/OpratorUtil.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.interpreter;
+package com.baiye.design.pattern.behavioral.interpreter;
public class OpratorUtil {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/Test.java
similarity index 85%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/Test.java
index 397b1cb..e68ed23 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.interpreter;
+package com.baiye.design.pattern.behavioral.interpreter;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/Course.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/Course.java
similarity index 76%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/Course.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/Course.java
index b66f8ce..c0d63c3 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/Course.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/Course.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.iterator;
+package com.baiye.design.pattern.behavioral.iterator;
public class Course {
private String name;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/CourseAggregate.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/CourseAggregate.java
similarity index 82%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/CourseAggregate.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/CourseAggregate.java
index 1200c8c..aa45c70 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/CourseAggregate.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/CourseAggregate.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.iterator;
+package com.baiye.design.pattern.behavioral.iterator;
public interface CourseAggregate {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/CourseAggregateImpl.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/CourseAggregateImpl.java
similarity index 91%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/CourseAggregateImpl.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/CourseAggregateImpl.java
index b470894..3b3e259 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/CourseAggregateImpl.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/CourseAggregateImpl.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.iterator;
+package com.baiye.design.pattern.behavioral.iterator;
import java.util.ArrayList;
import java.util.List;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/CourseIterator.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/CourseIterator.java
similarity index 63%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/CourseIterator.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/CourseIterator.java
index 6dbb80f..92cb64e 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/CourseIterator.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/CourseIterator.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.iterator;
+package com.baiye.design.pattern.behavioral.iterator;
public interface CourseIterator {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/CourseIteratorImpl.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/CourseIteratorImpl.java
similarity index 92%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/CourseIteratorImpl.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/CourseIteratorImpl.java
index 6f2f5db..1928b26 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/CourseIteratorImpl.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/CourseIteratorImpl.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.iterator;
+package com.baiye.design.pattern.behavioral.iterator;
import java.util.List;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/Test.java
similarity index 96%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/Test.java
index f62823d..db1cfe4 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/iterator/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/iterator/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.iterator;
+package com.baiye.design.pattern.behavioral.iterator;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/mediator/StudyGroup.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/mediator/StudyGroup.java
similarity index 81%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/mediator/StudyGroup.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/mediator/StudyGroup.java
index bc527b1..0190899 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/mediator/StudyGroup.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/mediator/StudyGroup.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.mediator;
+package com.baiye.design.pattern.behavioral.mediator;
import java.util.Date;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/mediator/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/mediator/Test.java
similarity index 80%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/mediator/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/mediator/Test.java
index 74ce1f1..47fa3c5 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/mediator/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/mediator/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.mediator;
+package com.baiye.design.pattern.behavioral.mediator;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/mediator/User.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/mediator/User.java
similarity index 86%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/mediator/User.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/mediator/User.java
index 4cc9543..2dc54c7 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/mediator/User.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/mediator/User.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.mediator;
+package com.baiye.design.pattern.behavioral.mediator;
public class User {
private String name;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/memento/Article.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/memento/Article.java
similarity index 96%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/memento/Article.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/memento/Article.java
index 756384a..cc47205 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/memento/Article.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/memento/Article.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.memento;
+package com.baiye.design.pattern.behavioral.memento;
public class Article {
private String title;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/memento/ArticleMemento.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/memento/ArticleMemento.java
similarity index 93%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/memento/ArticleMemento.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/memento/ArticleMemento.java
index b737c25..757a7f2 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/memento/ArticleMemento.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/memento/ArticleMemento.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.memento;
+package com.baiye.design.pattern.behavioral.memento;
/**
* 快照类
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/memento/ArticleMementoManager.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/memento/ArticleMementoManager.java
similarity index 88%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/memento/ArticleMementoManager.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/memento/ArticleMementoManager.java
index 9c0240b..8ce4f1f 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/memento/ArticleMementoManager.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/memento/ArticleMementoManager.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.memento;
+package com.baiye.design.pattern.behavioral.memento;
import java.util.Stack;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/memento/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/memento/Test.java
similarity index 96%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/memento/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/memento/Test.java
index dfcf621..59f12d5 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/memento/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/memento/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.memento;
+package com.baiye.design.pattern.behavioral.memento;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/observer/Course.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/observer/Course.java
similarity index 91%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/observer/Course.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/observer/Course.java
index d7b08c1..686a293 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/observer/Course.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/observer/Course.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.observer;
+package com.baiye.design.pattern.behavioral.observer;
import java.util.Observable;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/observer/Question.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/observer/Question.java
similarity index 89%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/observer/Question.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/observer/Question.java
index 18ca3d8..b25815e 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/observer/Question.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/observer/Question.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.observer;
+package com.baiye.design.pattern.behavioral.observer;
public class Question {
private String userName;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/observer/Teacher.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/observer/Teacher.java
similarity index 91%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/observer/Teacher.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/observer/Teacher.java
index 58e31aa..7cf7328 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/observer/Teacher.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/observer/Teacher.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.observer;
+package com.baiye.design.pattern.behavioral.observer;
import java.util.Observable;
import java.util.Observer;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/observer/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/observer/Test.java
similarity index 91%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/observer/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/observer/Test.java
index 5b0178d..59f8601 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/observer/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/observer/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.observer;
+package com.baiye.design.pattern.behavioral.observer;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/CourseVideoContext.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/CourseVideoContext.java
similarity index 95%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/CourseVideoContext.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/CourseVideoContext.java
index 2b153b7..064d60b 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/CourseVideoContext.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/CourseVideoContext.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.state;
+package com.baiye.design.pattern.behavioral.state;
public class CourseVideoContext {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/CourseVideoState.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/CourseVideoState.java
similarity index 89%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/CourseVideoState.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/CourseVideoState.java
index d514fb9..e57e50c 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/CourseVideoState.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/CourseVideoState.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.state;
+package com.baiye.design.pattern.behavioral.state;
public abstract class CourseVideoState {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/PauseState.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/PauseState.java
similarity index 92%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/PauseState.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/PauseState.java
index 64ca1a2..0c7cae3 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/PauseState.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/PauseState.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.state;
+package com.baiye.design.pattern.behavioral.state;
/**
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/PlayState.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/PlayState.java
similarity index 91%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/PlayState.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/PlayState.java
index c3312a6..9423dfb 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/PlayState.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/PlayState.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.state;
+package com.baiye.design.pattern.behavioral.state;
public class PlayState extends CourseVideoState{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/SpeedState.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/SpeedState.java
similarity index 91%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/SpeedState.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/SpeedState.java
index 9edb093..35e9e77 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/SpeedState.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/SpeedState.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.state;
+package com.baiye.design.pattern.behavioral.state;
public class SpeedState extends CourseVideoState{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/StopState.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/StopState.java
similarity index 90%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/StopState.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/StopState.java
index ea2316a..eb5cf23 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/StopState.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/StopState.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.state;
+package com.baiye.design.pattern.behavioral.state;
public class StopState extends CourseVideoState{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/Test.java
similarity index 95%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/Test.java
index d6d7ca3..760b403 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/state/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.state;
+package com.baiye.design.pattern.behavioral.state;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/EmptyPromotionStrategy.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/EmptyPromotionStrategy.java
similarity index 75%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/EmptyPromotionStrategy.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/EmptyPromotionStrategy.java
index 075e31e..0ed9ce7 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/EmptyPromotionStrategy.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/EmptyPromotionStrategy.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.strategy;
+package com.baiye.design.pattern.behavioral.strategy;
public class EmptyPromotionStrategy implements PromotionStrategy{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/FanxianPromotionStrategy.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/FanxianPromotionStrategy.java
similarity index 79%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/FanxianPromotionStrategy.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/FanxianPromotionStrategy.java
index 881e95e..20a0e1e 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/FanxianPromotionStrategy.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/FanxianPromotionStrategy.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.strategy;
+package com.baiye.design.pattern.behavioral.strategy;
public class FanxianPromotionStrategy implements PromotionStrategy {
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/LIjianPromotionStrategy.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/LIjianPromotionStrategy.java
similarity index 79%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/LIjianPromotionStrategy.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/LIjianPromotionStrategy.java
index 68a248f..cff5778 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/LIjianPromotionStrategy.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/LIjianPromotionStrategy.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.strategy;
+package com.baiye.design.pattern.behavioral.strategy;
public class LIjianPromotionStrategy implements PromotionStrategy{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/ManjianPromotionStrategy.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/ManjianPromotionStrategy.java
similarity index 77%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/ManjianPromotionStrategy.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/ManjianPromotionStrategy.java
index f90705b..337e486 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/ManjianPromotionStrategy.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/ManjianPromotionStrategy.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.strategy;
+package com.baiye.design.pattern.behavioral.strategy;
public class ManjianPromotionStrategy implements PromotionStrategy{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/PromotionActivity.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/PromotionActivity.java
similarity index 84%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/PromotionActivity.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/PromotionActivity.java
index 1544dbb..0748707 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/PromotionActivity.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/PromotionActivity.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.strategy;
+package com.baiye.design.pattern.behavioral.strategy;
public class PromotionActivity {
private PromotionStrategy promotionStrategy;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/PromotionStrategy.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/PromotionStrategy.java
similarity index 54%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/PromotionStrategy.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/PromotionStrategy.java
index 229d53c..179dd93 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/PromotionStrategy.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/PromotionStrategy.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.strategy;
+package com.baiye.design.pattern.behavioral.strategy;
public interface PromotionStrategy {
void doPromotion();
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/PromotionStrategyFactory.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/PromotionStrategyFactory.java
similarity index 95%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/PromotionStrategyFactory.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/PromotionStrategyFactory.java
index c2c2c53..77cd4db 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/PromotionStrategyFactory.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/PromotionStrategyFactory.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.strategy;
+package com.baiye.design.pattern.behavioral.strategy;
import java.util.HashMap;
import java.util.Map;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/Test.java
similarity index 93%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/Test.java
index 20d83a4..543d8ae 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/strategy/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/strategy/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.strategy;
+package com.baiye.design.pattern.behavioral.strategy;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/templatemethod/ACourse.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/templatemethod/ACourse.java
similarity index 93%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/templatemethod/ACourse.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/templatemethod/ACourse.java
index 21c1d17..23d6845 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/templatemethod/ACourse.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/templatemethod/ACourse.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.templatemethod;
+package com.baiye.design.pattern.behavioral.templatemethod;
public abstract class ACourse {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/templatemethod/DesignPatternCourse.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/templatemethod/DesignPatternCourse.java
similarity index 83%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/templatemethod/DesignPatternCourse.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/templatemethod/DesignPatternCourse.java
index 6bb1e59..e3b7d85 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/templatemethod/DesignPatternCourse.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/templatemethod/DesignPatternCourse.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.templatemethod;
+package com.baiye.design.pattern.behavioral.templatemethod;
public class DesignPatternCourse extends ACourse{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/templatemethod/FECourse.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/templatemethod/FECourse.java
similarity index 91%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/templatemethod/FECourse.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/templatemethod/FECourse.java
index a897b18..9f732ff 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/templatemethod/FECourse.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/templatemethod/FECourse.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.templatemethod;
+package com.baiye.design.pattern.behavioral.templatemethod;
public class FECourse extends ACourse{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/templatemethod/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/templatemethod/Test.java
similarity index 89%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/templatemethod/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/templatemethod/Test.java
index 9cb02a5..aedfffc 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/templatemethod/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/templatemethod/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.templatemethod;
+package com.baiye.design.pattern.behavioral.templatemethod;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/CodingCourse.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/CodingCourse.java
similarity index 87%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/CodingCourse.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/CodingCourse.java
index fa53a11..e1b136c 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/CodingCourse.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/CodingCourse.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.visitor;
+package com.baiye.design.pattern.behavioral.visitor;
public class CodingCourse extends Course{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Course.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/Course.java
similarity index 82%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Course.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/Course.java
index c94a96b..73541e1 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Course.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/Course.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.visitor;
+package com.baiye.design.pattern.behavioral.visitor;
public abstract class Course {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/FreeCourse.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/FreeCourse.java
similarity index 71%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/FreeCourse.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/FreeCourse.java
index bfa5805..3068297 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/FreeCourse.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/FreeCourse.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.visitor;
+package com.baiye.design.pattern.behavioral.visitor;
public class FreeCourse extends Course{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/IVisitor.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/IVisitor.java
similarity index 68%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/IVisitor.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/IVisitor.java
index 93c8e64..ecfb6d7 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/IVisitor.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/IVisitor.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.visitor;
+package com.baiye.design.pattern.behavioral.visitor;
public interface IVisitor {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/Test.java
similarity index 91%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/Test.java
index c003dff..58163fc 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.visitor;
+package com.baiye.design.pattern.behavioral.visitor;
import java.util.ArrayList;
import java.util.List;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Visitor.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/Visitor.java
similarity index 92%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Visitor.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/Visitor.java
index 4ac499f..db8d7ba 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Visitor.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/visitor/Visitor.java
@@ -1,4 +1,4 @@
-package com.baiye.design.behavioral.visitor;
+package com.baiye.design.pattern.behavioral.visitor;
public class Visitor implements IVisitor{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/LazyDoubleCheckSingleton.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/LazyDoubleCheckSingleton.java
new file mode 100644
index 0000000..46dbf71
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/LazyDoubleCheckSingleton.java
@@ -0,0 +1,34 @@
+package com.baiye.design.pattern.creational.singleton.lazy;
+
+public class LazyDoubleCheckSingleton {
+ // 使用 volatile 来防止指令重排序
+ private volatile static LazyDoubleCheckSingleton lazyDoubleCheckSingleton = null;
+
+ /**
+ * 私有构造器
+ */
+ private LazyDoubleCheckSingleton() {
+
+ }
+
+ /**
+ * 线程不安全 -> 加快锁
+ */
+ public static LazyDoubleCheckSingleton getInstance() {
+ if (null == lazyDoubleCheckSingleton) {
+ // 锁定的是单例的类
+ synchronized (LazyDoubleCheckSingleton.class) {
+ if (null == lazyDoubleCheckSingleton) {
+ // 1. 分配内存给这个对象
+ // 2. 初始化对象
+ // 3. 设置 lazyDoubleCheckSingleton 指向刚分配的内存地址
+
+ // fixme 在 2 3 时候可能被重排序 intra-thread semantics 的说明知道 2-3 互换位置不会改变程序的执行结果,允许重排序可以加快程序的执行性能
+ lazyDoubleCheckSingleton = new LazyDoubleCheckSingleton();
+
+ }
+ }
+ }
+ return lazyDoubleCheckSingleton;
+ }
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/LazySingleton.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/LazySingleton.java
new file mode 100644
index 0000000..a6e6e91
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/LazySingleton.java
@@ -0,0 +1,27 @@
+package com.baiye.design.pattern.creational.singleton.lazy;
+
+/**
+ * 懒汉式单例模式
+ */
+public class LazySingleton {
+ private static LazySingleton lazySingleton = null;
+
+ /**
+ * 私有构造器
+ */
+ private LazySingleton() {
+
+ }
+
+ /**
+ * 线程不安全 -> 加快锁
+ */
+ public static LazySingleton getInstance() {
+ synchronized (LazySingleton.class){
+ if (null == lazySingleton) {
+ lazySingleton = new LazySingleton();
+ }
+ }
+ return lazySingleton;
+ }
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/T.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/T.java
new file mode 100644
index 0000000..8cb8e08
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/T.java
@@ -0,0 +1,9 @@
+package com.baiye.design.pattern.creational.singleton.lazy;
+
+public class T implements Runnable{
+ @Override
+ public void run() {
+ LazySingleton lazySingleton = LazySingleton.getInstance();
+ System.out.println(Thread.currentThread().getName() + " " + lazySingleton);
+ }
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/Test.java
new file mode 100644
index 0000000..764e3e7
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/Test.java
@@ -0,0 +1,12 @@
+package com.baiye.design.pattern.creational.singleton.lazy;
+
+public class Test {
+
+ public static void main(String[] args) {
+ Thread t1 = new Thread(new T());
+ Thread t2 = new Thread(new T());
+ t1.start();
+ t2.start();
+ System.out.println("program end");
+ }
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Adaptee.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Adaptee.java
similarity index 64%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Adaptee.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Adaptee.java
index 4e73905..ae85037 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Adaptee.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Adaptee.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.adapter.objectadapter;
+package com.baiye.design.pattern.structural.adapter.clazzadapter;
public class Adaptee {
public void adapteeRequest(){
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Adapter.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Adapter.java
similarity index 84%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Adapter.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Adapter.java
index fbe6441..851f25f 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Adapter.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Adapter.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.adapter.clazzadapter;
+package com.baiye.design.pattern.structural.adapter.clazzadapter;
/**
* 适配器 把Adaptee的方法适配给Target接口
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/ConcreteTarget.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/ConcreteTarget.java
similarity index 70%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/ConcreteTarget.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/ConcreteTarget.java
index 3238aa5..09b045a 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/ConcreteTarget.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/ConcreteTarget.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.adapter.clazzadapter;
+package com.baiye.design.pattern.structural.adapter.clazzadapter;
public class ConcreteTarget implements Target{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Target.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Target.java
new file mode 100644
index 0000000..51be962
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Target.java
@@ -0,0 +1,5 @@
+package com.baiye.design.pattern.structural.adapter.clazzadapter;
+
+public interface Target {
+ void request();
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Test.java
similarity index 81%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Test.java
index c3c897f..0d143f7 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.adapter.clazzadapter;
+package com.baiye.design.pattern.structural.adapter.clazzadapter;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Adaptee.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Adaptee.java
similarity index 63%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Adaptee.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Adaptee.java
index 77c2e9c..3ee6efa 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Adaptee.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Adaptee.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.adapter.clazzadapter;
+package com.baiye.design.pattern.structural.adapter.objectadapter;
public class Adaptee {
public void adapteeRequest(){
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Adapter.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Adapter.java
similarity index 82%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Adapter.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Adapter.java
index 514021b..227bf79 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Adapter.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Adapter.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.adapter.objectadapter;
+package com.baiye.design.pattern.structural.adapter.objectadapter;
public class Adapter implements Target{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/ConcreteTarget.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/ConcreteTarget.java
similarity index 70%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/ConcreteTarget.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/ConcreteTarget.java
index 20a866a..f0fcf04 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/ConcreteTarget.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/ConcreteTarget.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.adapter.objectadapter;
+package com.baiye.design.pattern.structural.adapter.objectadapter;
public class ConcreteTarget implements Target{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Target.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Target.java
new file mode 100644
index 0000000..d2c4d7a
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Target.java
@@ -0,0 +1,5 @@
+package com.baiye.design.pattern.structural.adapter.objectadapter;
+
+public interface Target {
+ void request();
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Test.java
similarity index 76%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Test.java
index 75b41ff..695ab57 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.adapter.objectadapter;
+package com.baiye.design.pattern.structural.adapter.objectadapter;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/ABCBank.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/ABCBank.java
similarity index 84%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/ABCBank.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/ABCBank.java
index c280940..e996288 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/ABCBank.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/ABCBank.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.bridge;
+package com.baiye.design.pattern.structural.bridge;
public class ABCBank extends Bank{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/Account.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/Account.java
similarity index 62%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/Account.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/Account.java
index bfb817f..0ade36e 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/Account.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/Account.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.bridge;
+package com.baiye.design.pattern.structural.bridge;
public interface Account {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/Bank.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/Bank.java
similarity index 81%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/Bank.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/Bank.java
index 9fb1f7d..d2ed79e 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/Bank.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/Bank.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.bridge;
+package com.baiye.design.pattern.structural.bridge;
public abstract class Bank {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/DepositAccount.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/DepositAccount.java
similarity index 85%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/DepositAccount.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/DepositAccount.java
index 45b01e8..dbf1a62 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/DepositAccount.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/DepositAccount.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.bridge;
+package com.baiye.design.pattern.structural.bridge;
public class DepositAccount implements Account{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/ICBCBank.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/ICBCBank.java
similarity index 84%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/ICBCBank.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/ICBCBank.java
index a0f637b..7d9afcb 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/ICBCBank.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/ICBCBank.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.bridge;
+package com.baiye.design.pattern.structural.bridge;
public class ICBCBank extends Bank{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/SavingAccount.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/SavingAccount.java
similarity index 85%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/SavingAccount.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/SavingAccount.java
index 25842ae..b534b4f 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/SavingAccount.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/SavingAccount.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.bridge;
+package com.baiye.design.pattern.structural.bridge;
public class SavingAccount implements Account{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/Test.java
similarity index 87%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/Test.java
index dc1c16b..ddbb711 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/bridge/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/bridge/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.bridge;
+package com.baiye.design.pattern.structural.bridge;
public class Test {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/CatalogComponent.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/composite/CatalogComponent.java
similarity index 93%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/CatalogComponent.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/composite/CatalogComponent.java
index c65f6e4..025b582 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/CatalogComponent.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/composite/CatalogComponent.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.composite;
+package com.baiye.design.pattern.structural.composite;
public abstract class CatalogComponent {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/Course.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/composite/Course.java
similarity index 90%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/Course.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/composite/Course.java
index 187f88b..bdaefd5 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/Course.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/composite/Course.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.composite;
+package com.baiye.design.pattern.structural.composite;
public class Course extends CatalogComponent{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/CourseCatalog.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/composite/CourseCatalog.java
similarity index 93%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/CourseCatalog.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/composite/CourseCatalog.java
index 227bff5..c45fada 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/CourseCatalog.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/composite/CourseCatalog.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.composite;
+package com.baiye.design.pattern.structural.composite;
import java.util.ArrayList;
import java.util.List;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/composite/Test.java
similarity index 68%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/composite/Test.java
index 2eff506..5fab4a0 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/composite/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.composite;
+package com.baiye.design.pattern.structural.composite;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/Battercake.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v1/Battercake.java
similarity index 71%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/Battercake.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v1/Battercake.java
index 27849b7..7f6ddd7 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/Battercake.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v1/Battercake.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.decorator.v1;
+package com.baiye.design.pattern.structural.decorator.v1;
public class Battercake {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/BattercakeWithEgg.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v1/BattercakeWithEgg.java
similarity index 80%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/BattercakeWithEgg.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v1/BattercakeWithEgg.java
index d17dae6..fa579f6 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/BattercakeWithEgg.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v1/BattercakeWithEgg.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.decorator.v1;
+package com.baiye.design.pattern.structural.decorator.v1;
public class BattercakeWithEgg extends Battercake{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/BattercakeWithEggSausage.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v1/BattercakeWithEggSausage.java
similarity index 81%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/BattercakeWithEggSausage.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v1/BattercakeWithEggSausage.java
index 74e92a7..a7ad471 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/BattercakeWithEggSausage.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v1/BattercakeWithEggSausage.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.decorator.v1;
+package com.baiye.design.pattern.structural.decorator.v1;
public class BattercakeWithEggSausage extends BattercakeWithEgg{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v1/Test.java
similarity index 92%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v1/Test.java
index 0b224d1..942da22 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v1/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.decorator.v1;
+package com.baiye.design.pattern.structural.decorator.v1;
public class Test {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/ABattercake.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/ABattercake.java
similarity index 66%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/ABattercake.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/ABattercake.java
index 26575cf..dc5053a 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/ABattercake.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/ABattercake.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.decorator.v2;
+package com.baiye.design.pattern.structural.decorator.v2;
public abstract class ABattercake {
protected abstract String getDesc();
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/AbstractDecorator.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/AbstractDecorator.java
similarity index 87%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/AbstractDecorator.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/AbstractDecorator.java
index 4916db6..22645c8 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/AbstractDecorator.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/AbstractDecorator.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.decorator.v2;
+package com.baiye.design.pattern.structural.decorator.v2;
/**
* @author Administrator
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/AbstractDecorator2.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/AbstractDecorator2.java
similarity index 91%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/AbstractDecorator2.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/AbstractDecorator2.java
index c2c5f3d..01c08c6 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/AbstractDecorator2.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/AbstractDecorator2.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.decorator.v2;
+package com.baiye.design.pattern.structural.decorator.v2;
/**
* 装饰者类的第二种形式 对原装饰者进行修改,扩展到更多的方法
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/Battercake.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/Battercake.java
similarity index 77%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/Battercake.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/Battercake.java
index 9c6f8f9..50f144b 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/Battercake.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/Battercake.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.decorator.v2;
+package com.baiye.design.pattern.structural.decorator.v2;
public class Battercake extends ABattercake{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/EggDecorator.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/EggDecorator.java
similarity index 85%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/EggDecorator.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/EggDecorator.java
index b1fe583..3aecd4a 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/EggDecorator.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/EggDecorator.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.decorator.v2;
+package com.baiye.design.pattern.structural.decorator.v2;
public class EggDecorator extends AbstractDecorator{
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/SausageDecorator.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/SausageDecorator.java
similarity index 85%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/SausageDecorator.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/SausageDecorator.java
index 942fbc2..7d67996 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/SausageDecorator.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/SausageDecorator.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.decorator.v2;
+package com.baiye.design.pattern.structural.decorator.v2;
public class SausageDecorator extends AbstractDecorator{
public SausageDecorator(ABattercake aBattercake) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/Test.java
similarity index 86%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/Test.java
index 96bbdf3..fb98710 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/decorator/v2/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.decorator.v2;
+package com.baiye.design.pattern.structural.decorator.v2;
public class Test {
public static void main(String[] args) {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/GiftExchangeService.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/GiftExchangeService.java
new file mode 100644
index 0000000..f5e3188
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/GiftExchangeService.java
@@ -0,0 +1,21 @@
+package com.baiye.design.pattern.structural.facade;
+
+public class GiftExchangeService {
+ // 注入子系统服务
+ private QualifyService qualifyService = new QualifyService();
+ private PointsPaymentService pointsPaymentService = new PointsPaymentService();
+ private ShippingService shippingService = new ShippingService();
+
+
+ public void giftExchange(PointsGift pointsGift) {
+ if (qualifyService.isAvailable(pointsGift)) {
+ // 资格校验通过
+ if (pointsPaymentService.pay(pointsGift)) {
+ // 如果支付积分成功
+ String shippingOrderNo = shippingService.shipGift(pointsGift);
+ System.out.println("物流系统下单成功,订单号是: " + shippingOrderNo);
+ }
+ }
+
+ }
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/PointsGift.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/PointsGift.java
new file mode 100644
index 0000000..ca538c1
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/PointsGift.java
@@ -0,0 +1,13 @@
+package com.baiye.design.pattern.structural.facade;
+
+public class PointsGift {
+ private String name;
+
+ public PointsGift(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/PointsPaymentService.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/PointsPaymentService.java
new file mode 100644
index 0000000..2a997aa
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/PointsPaymentService.java
@@ -0,0 +1,10 @@
+package com.baiye.design.pattern.structural.facade;
+
+public class PointsPaymentService {
+
+ public boolean pay(PointsGift pointsGift) {
+ // 扣减积分
+ System.out.println("支付" + pointsGift.getName() + "积分成功");
+ return true;
+ }
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/QualifyService.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/QualifyService.java
new file mode 100644
index 0000000..8c7a38a
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/QualifyService.java
@@ -0,0 +1,12 @@
+package com.baiye.design.pattern.structural.facade;
+
+/**
+ * 子系统
+ */
+public class QualifyService {
+
+ public boolean isAvailable(PointsGift pointsGift) {
+ System.out.println("校验" + pointsGift.getName() + "积分兑换资格通过,库存通过");
+ return true;
+ }
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/ShippingService.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/ShippingService.java
new file mode 100644
index 0000000..0f2537b
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/ShippingService.java
@@ -0,0 +1,10 @@
+package com.baiye.design.pattern.structural.facade;
+
+public class ShippingService {
+ public String shipGift(PointsGift pointsGift) {
+ // 物流系统的对接逻辑
+ System.out.println(pointsGift.getName() + "进入物流系统");
+ String shippingOrderNo = "666";
+ return shippingOrderNo;
+ }
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/Test.java
new file mode 100644
index 0000000..228afab
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/Test.java
@@ -0,0 +1,14 @@
+package com.baiye.design.pattern.structural.facade;
+
+public class Test {
+ public static void main(String[] args) {
+ PointsGift t = new PointsGift("T");
+ GiftExchangeService giftExchangeService = new GiftExchangeService();
+
+// giftExchangeService.setQualifyService(new QualifyService());
+// giftExchangeService.setPointsPaymentService(new PointsPaymentService());
+// giftExchangeService.setShippingService(new ShippingService());
+
+ giftExchangeService.giftExchange(t);
+ }
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/Employee.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/Employee.java
new file mode 100644
index 0000000..58dda6d
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/Employee.java
@@ -0,0 +1,5 @@
+package com.baiye.design.pattern.structural.flyweight;
+
+public interface Employee {
+ void reprot();
+}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/EmployeeFactory.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/EmployeeFactory.java
similarity index 93%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/EmployeeFactory.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/EmployeeFactory.java
index c5447ac..f104e06 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/EmployeeFactory.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/EmployeeFactory.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.flyweight;
+package com.baiye.design.pattern.structural.flyweight;
import java.util.HashMap;
import java.util.Map;
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Manager.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/Manager.java
similarity index 89%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Manager.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/Manager.java
index f80311e..2bc906c 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Manager.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/Manager.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.flyweight;
+package com.baiye.design.pattern.structural.flyweight;
public class Manager implements Employee{
@Override
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/Test.java
similarity index 93%
rename from dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Test.java
rename to dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/Test.java
index b94fd30..0b319c9 100644
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Test.java
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/Test.java
@@ -1,4 +1,4 @@
-package com.baiye.design.structural.flyweight;
+package com.baiye.design.pattern.structural.flyweight;
public class Test {
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Target.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Target.java
deleted file mode 100644
index 273f805..0000000
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Target.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.baiye.design.structural.adapter.clazzadapter;
-
-public interface Target {
- void request();
-}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Target.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Target.java
deleted file mode 100644
index b192af0..0000000
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Target.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.baiye.design.structural.adapter.objectadapter;
-
-public interface Target {
- void request();
-}
diff --git a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Employee.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Employee.java
deleted file mode 100644
index 53799d3..0000000
--- a/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Employee.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.baiye.design.structural.flyweight;
-
-public interface Employee {
- void reprot();
-}
diff --git a/dev-protocol-extend/java-call-other/README.md b/dev-protocol-extend/java-call-other/README.md
new file mode 100644
index 0000000..1161732
--- /dev/null
+++ b/dev-protocol-extend/java-call-other/README.md
@@ -0,0 +1,20 @@
+# Java 对外部的调用
+
+## Java 中调用 Python动态传入参数
+
+### 1 使用场景
+
+- 在定时任务调度场景中会用到,需要定时去触发某个作业,作业需要支撑业务线丰富的场景,可以是接口调用、Shell 脚本执行、推送 MQ、Python 脚本执行等。
+- Python 拥有非常丰富的第三方类库,有些功能用 Python 来实现的话,可能仅仅需要引入一下包,几行代码就搞定了。
+
+### 2 官网地址
+- 官网地址:https://www.jython.org/
+- Github 地址:https://github.com/jython/jython
+
+### 3 准备步骤
+- 导入依赖
+- 需要在你的机器上先安装好 Python 环境
+- 新建单元测试,通过 Java 代码直接执行 Python 语句:
+
+### 4. 代码地址
+- test目录下 (com.baiye.demo1)
\ No newline at end of file
diff --git a/dev-protocol-extend/java-call-other/pom.xml b/dev-protocol-extend/java-call-other/pom.xml
new file mode 100644
index 0000000..a3776f1
--- /dev/null
+++ b/dev-protocol-extend/java-call-other/pom.xml
@@ -0,0 +1,35 @@
+
+
+
+ dev-protocol
+ org.example
+ 1.0-SNAPSHOT
+ ../../pom.xml
+
+ 4.0.0
+
+ java-call-other
+
+
+ 8
+ 8
+
+
+
+
+
+ org.python
+ jython-standalone
+ 2.7.2
+
+
+
+ junit
+ junit
+ test
+
+
+
+
\ No newline at end of file
diff --git a/dev-protocol-extend/java-call-other/src/test/java/com/baiye/demo1/JavaCallPythonSimpleTest.java b/dev-protocol-extend/java-call-other/src/test/java/com/baiye/demo1/JavaCallPythonSimpleTest.java
new file mode 100644
index 0000000..75da82a
--- /dev/null
+++ b/dev-protocol-extend/java-call-other/src/test/java/com/baiye/demo1/JavaCallPythonSimpleTest.java
@@ -0,0 +1,101 @@
+package com.baiye.demo1;
+
+
+import org.junit.Test;
+import org.python.core.Py;
+import org.python.core.PyFunction;
+import org.python.core.PyObject;
+import org.python.core.PyString;
+import org.python.util.PythonInterpreter;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+public class JavaCallPythonSimpleTest {
+
+ /**
+ * 直接执行 python 语句
+ */
+ @Test
+ public void executePython() {
+ // 一条简单的 python 语句,打印 Hello world !
+ String py = "print('Hello world!')";
+
+ PythonInterpreter interpreter = new PythonInterpreter();
+ // 执行 Python 语句
+ interpreter.exec(py);
+ }
+
+ /**
+ * 通过执行 python 文件
+ */
+ @Test
+ public void executePythonFile() {
+ // 定义脚本路径 - 这里使用的是绝对路径
+ String path = "C:\\Users\\Administrator\\Desktop\\study_pro\\dev-protocol\\dev-protocol-extend\\java-call-python\\src\\test\\java\\com\\baiye\\demo1\\test.py";
+
+ PythonInterpreter interpreter = new PythonInterpreter();
+ // 执行脚本文件
+ interpreter.execfile(path);
+ }
+
+ /**
+ * 另外一种方式:Runtime.getRuntime() 执行 python 脚本文件
+ */
+ @Test
+ public void executePythonFile2() {
+ Process proc;
+ BufferedReader reader;
+ try {
+ // 直接执行 python 命令的方式来执行脚本
+ proc = Runtime.getRuntime().exec("python C:\\Users\\Administrator\\Desktop\\study_pro\\dev-protocol\\dev-protocol-extend\\java-call-python\\src\\test\\java\\com\\baiye\\demo1\\test.py");
+ reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+
+ String line = null;
+ while ((line = reader.readLine()) != null) {
+ // 打印输出
+ System.out.println(line);
+ }
+
+ reader.close();
+ proc.waitFor();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 调用 Python 脚本调用某个函数,并动态传入参数,打印结果
+ *
+ * 通过 Jython 去调用 test1.py 的 sendEmail 函数:
+ *
+ * ps: 一定要在 python 文件中加入字符集编码 # -*- coding: utf-8 -*-
+ * ps: 详细参考:https://peps.python.org/pep-0263/
+ * ps: QQ邮箱可能会把这种邮件判定为垃圾邮件,控制台会报错为500 http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000726:
+ * ps: 如果收不到也可以将发送者的邮箱地址设置为 QQ 邮件白名单。
+ */
+ @Test
+ public void executePythonFunction() {
+ PythonInterpreter interpreter = new PythonInterpreter();
+ // 指定指定路径下的 python 脚本
+ interpreter.execfile("C:\\Users\\Administrator\\Desktop\\study_pro\\dev-protocol\\dev-protocol-extend\\java-call-python\\src\\test\\java\\com\\baiye\\demo1\\test1.py");
+
+ // 指定需要调用的函数
+ PyFunction function = interpreter.get("sendEmail", PyFunction.class);
+ // ↓↓↓↓↓↓↓↓ 需要传入的参数 ↓↓↓↓↓↓↓↓
+ // 邮件接受者
+ PyString receiver = Py.newStringOrUnicode("xxx@qq.com");
+ // 邮件主题
+ PyString subject = Py.newStringOrUnicode("打个招呼【动态参数】");
+ // 邮件内容
+ PyString content = Py.newStringOrUnicode("我是犬小哈【动态参数】");
+
+ // 调用
+ PyObject pyObject = function.__call__(receiver, subject, content);
+
+ // 打印返回结果
+ System.out.printf("result: %s%n", pyObject);
+ }
+
+
+}
diff --git a/dev-protocol-extend/java-call-other/src/test/java/com/baiye/demo1/test.py b/dev-protocol-extend/java-call-other/src/test/java/com/baiye/demo1/test.py
new file mode 100644
index 0000000..103fee8
--- /dev/null
+++ b/dev-protocol-extend/java-call-other/src/test/java/com/baiye/demo1/test.py
@@ -0,0 +1 @@
+print('Hello world by file !')
\ No newline at end of file
diff --git a/dev-protocol-extend/java-call-other/src/test/java/com/baiye/demo1/test1.py b/dev-protocol-extend/java-call-other/src/test/java/com/baiye/demo1/test1.py
new file mode 100644
index 0000000..004fcb8
--- /dev/null
+++ b/dev-protocol-extend/java-call-other/src/test/java/com/baiye/demo1/test1.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+import smtplib
+from email.mime.text import MIMEText
+
+# 邮件服务器地址
+mail_host = 'smtp.qq.com'
+# 邮件服务器用户名
+mail_user = 'xxx@qq.com'
+# 邮件服务器登录密码(有些是授权码)
+mail_pwd = 'xxx'
+# 邮件发送者
+sender = 'xxx@qq.com'
+
+def sendEmail(receiver, subject, content):
+ """
+ 发送邮件
+ :param receiver: 接收者
+ :param subject: 邮件主题
+ :param content: 邮件内容
+ :return:
+ """
+ message = MIMEText(content, 'plain', 'utf-8')
+ # 邮件主题
+ message['Subject'] = subject
+ # 发送方
+ message['From'] = sender
+ # 接收方
+ message['To'] = receiver
+
+ try:
+ # 连接到服务器
+ smtp = smtplib.SMTP_SSL(mail_host)
+ # 登录服务器
+ smtp.login(mail_user, mail_pwd)
+ # 发送
+ smtp.sendmail(sender, receiver, message.as_string())
+ # 推出
+ smtp.quit()
+ return 'send email success ...'
+ except smtplib.SMTPException as e:
+ print('error', e)
+
+
+if __name__ == '__main__':
+ # 邮件接受者
+ receiver = 'xxx@qq.com'
+ # 邮件主题
+ subject = '打个招呼'
+ # 邮件内容
+ content = '我是犬小哈'
+ sendEmail(receiver, subject, content)
\ No newline at end of file
diff --git a/dev-protocol-extend/pom.xml b/dev-protocol-extend/pom.xml
new file mode 100644
index 0000000..cce4411
--- /dev/null
+++ b/dev-protocol-extend/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ dev-protocol
+ org.example
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ dev-protocol-extend
+ pom
+
+
+ 8
+ 8
+
+
+
\ No newline at end of file
diff --git a/dev-protocol-springboot/pom.xml b/dev-protocol-springboot/pom.xml
new file mode 100644
index 0000000..c15f99e
--- /dev/null
+++ b/dev-protocol-springboot/pom.xml
@@ -0,0 +1,19 @@
+
+
+
+ dev-protocol
+ org.example
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ dev-protocol-springboot
+
+
+ 8
+ 8
+
+
+
\ No newline at end of file
diff --git a/dev-protocol-springboot/src/main/java/com/baiye/retry/file/README.md b/dev-protocol-springboot/src/main/java/com/baiye/retry/file/README.md
new file mode 100644
index 0000000..327fa55
--- /dev/null
+++ b/dev-protocol-springboot/src/main/java/com/baiye/retry/file/README.md
@@ -0,0 +1,92 @@
+## 零侵入性:一个注解,优雅的实现循环重试功能
+
+### 1 工作场景
+- 在实际工作中,重处理是一个非常常见的场景,比如:
+ - 发送消息失败
+ - 调用远程服务失败(这个可以直接使用SpringCloud的组件机制实现)
+ - 争抢锁失败
+- spring-retry却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能
+
+### 2 @Retryable是什么
+- spring系列的spring-retry是另一个实用程序模块,可以帮助我们以标准方式处理任何特定操作的重试
+- 在spring-retry中,所有配置都是基于简单注释的
+
+### 3 使用步骤
+- pom依赖
+```xml
+
+ org.springframework.retry
+ spring-retry
+
+```
+- 启用@Retryable
+```java
+// 开启支持
+@EnableRetry
+@SpringBootApplication
+public class HelloApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(HelloApplication.class, args);
+ }
+
+}
+```
+- 方法上添加@Retryable
+```java
+import com.mail.elegant.service.TestRetryService;
+import org.springframework.retry.annotation.Backoff;
+import org.springframework.retry.annotation.Retryable;
+import org.springframework.stereotype.Service;
+import java.time.LocalTime;
+
+@Service
+public class TestRetryServiceImpl implements TestRetryService {
+
+ @Override
+ // 在这里添加
+ @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
+ public int test(int code) throws Exception{
+ System.out.println("test被调用,时间:"+LocalTime.now());
+ if (code==0){
+ throw new Exception("情况不对头!");
+ }
+ System.out.println("test被调用,情况对头了!");
+
+ return 200;
+ }
+}
+```
+- 来简单解释一下注解中几个参数的含义:
+ - value:抛出指定异常才会重试
+ - include:和value一样,默认为空,当exclude也为空时,默认所有异常
+ - exclude:指定不处理的异常
+ - maxAttempts:最大重试次数,默认3次
+ - backoff:重试等待策略
+ - 默认使用@Backoff,@Backoff的value默认为1000L,我们设置为2000L;
+ - multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。
+- 当重试耗尽时还是失败,会出现什么情况呢?
+ - 当重试耗尽时,RetryOperations可以将控制传递给另一个回调,即RecoveryCallback
+ - Spring-Retry还提供了@Recover注解,用于@Retryable重试失败后处理方法
+ - 如果不需要回调方法,可以直接不写回调方法,那么实现的效果是,重试次数完了后,如果还是没成功没符合业务判断,就抛出异常
+
+### 4 @Recover
+```java
+@Recover
+public int recover(Exception e, int code){
+ System.out.println("回调方法执行!!!!");
+ //记日志到数据库 或者调用其余的方法
+ return 400;
+}
+```
+- 可以看到传参里面写的是 Exception e,这个是作为回调的接头暗号(重试次数用完了,还是失败,我们抛出这个Exception e通知触发这个回调方法)
+- 对于@Recover注解的方法,需要特别注意的是:
+ - 方法的返回值必须与@Retryable方法一致
+ - 方法的第一个参数,必须是Throwable类型的,建议是与@Retryable配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@Recover方法中有的)
+ - 该回调方法与重试方法写在同一个实现类里面
+
+### 5 注意事项
+- 由于是基于AOP实现,所以不支持类里自调用方法
+- 如果重试失败需要给@Recover注解的方法做后续处理,那这个重试的方法不能有返回值,只能是void
+- 方法内不能使用try catch,只能往外抛异常
+- @Recover注解来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中),此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。
\ No newline at end of file
diff --git a/dev-protocol-springboot/src/main/java/com/baiye/shutdown/file/README.md b/dev-protocol-springboot/src/main/java/com/baiye/shutdown/file/README.md
new file mode 100644
index 0000000..774c868
--- /dev/null
+++ b/dev-protocol-springboot/src/main/java/com/baiye/shutdown/file/README.md
@@ -0,0 +1,437 @@
+## Spring Boot 优雅停机
+
+### 1 概念
+- 为确保应用关闭时,通知应用进程释放所占用的资源
+ - 线程池,shutdown(不接受新任务等待处理完)还是shutdownNow(调用 Thread.interrupt进行中断)
+ - socket 链接,比如:netty、mq
+ - 告知注册中心快速下线(靠心跳机制客服早都跳起来了),比如:eureka
+ - 清理临时文件,比如:poi
+ - 各种堆内堆外内存释放
+- 进程强制终止问题
+ - 数据丢失或者终端无法恢复到正常状态
+ - 在分布式环境下还可能导致数据不一致的情况
+
+### 2 kill指令
+- kill -9 pid 可以模拟了一次系统宕机,系统断电等极端情况
+- 而kill -15 pid 则是等待应用关闭,执行阻塞操作,有时候也会出现无法关闭应用的情况
+```shell
+#查看jvm进程pid
+jps
+#列出所有信号名称
+kill -l
+
+# Windows下信号常量值
+# 简称 全称 数值
+# INT SIGINT 2 Ctrl+C中断
+# ILL SIGILL 4 非法指令
+# FPE SIGFPE 8 floating point exception(浮点异常)
+# SEGV SIGSEGV 11 segment violation(段错误)
+# TERM SIGTERM 5 Software termination signal from kill(Kill发出的软件终止)
+# BREAK SIGBREAK 21 Ctrl-Break sequence(Ctrl+Break中断)
+# ABRT SIGABRT 22 abnormal termination triggered by abort call(Abort)
+
+#linux信号常量值
+# 简称 全称 数值
+# HUP SIGHUP 1 终端断线
+# INT SIGINT 2 中断(同 Ctrl + C)
+# QUIT SIGQUIT 3 退出(同 Ctrl + \)
+# KILL SIGKILL 9 强制终止
+# TERM SIGTERM 15 终止
+# CONT SIGCONT 18 继续(与STOP相反, fg/bg命令)
+# STOP SIGSTOP 19 暂停(同 Ctrl + Z)
+#....
+
+#可以理解为操作系统从内核级别强行杀死某个进程
+kill -9 pid
+#理解为发送一个通知,等待应用主动关闭
+kill -15 pid
+#也支持信号常量值全称或简写(就是去掉SIG后)
+kill -l KILL
+```
+- 总结: Java程序终止是让JVM接收到Linux信号量
+- 思考:jvm是如何接受处理linux信号量的?
+- 回答:当然是在jvm启动时就加载了自定义SignalHandler,关闭jvm时触发对应的handle。
+- 代码分析
+
+```java
+public interface SignalHandler {
+ SignalHandler SIG_DFL = new NativeSignalHandler(0L);
+ SignalHandler SIG_IGN = new NativeSignalHandler(1L);
+
+ void handle(Signal var1);
+}
+
+class Terminator {
+ private static SignalHandler handler = null;
+
+ Terminator() {
+ }
+
+ //jvm设置SignalHandler,在System.initializeSystemClass中触发
+ static void setup() {
+ if (handler == null) {
+ SignalHandler var0 = new SignalHandler() {
+ @Override
+ public void handle(Signal var1) {
+ Shutdown.exit(var1.getNumber() + 128);//调用Shutdown.exit
+ }
+ };
+ handler = var0;
+
+ try {
+ Signal.handle(new Signal("INT"), var0);//中断时
+ } catch (IllegalArgumentException var3) {
+ ;
+ }
+
+ try {
+ Signal.handle(new Signal("TERM"), var0);//终止时
+ } catch (IllegalArgumentException var2) {
+ ;
+ }
+
+ }
+ }
+}
+```
+### 3 核心原理代码 Runtime.addShutdownHook
+- 在了解Shutdown.exit之前,先看Runtime.getRuntime().addShutdownHook(shutdownHook); 则是为jvm中增加一个关闭的钩子,当jvm关闭的时候调用。
+- Java原生利用Hock来做
+```java
+public class Runtime {
+ public void addShutdownHook(Thread hook) {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null) {
+ sm.checkPermission(new RuntimePermission("shutdownHooks"));
+ }
+ ApplicationShutdownHooks.add(hook);
+ }
+}
+class ApplicationShutdownHooks {
+ /* The set of registered hooks */
+ private static IdentityHashMap hooks;
+ static synchronized void add(Thread hook) {
+ if(hooks == null)
+ throw new IllegalStateException("Shutdown in progress");
+
+ if (hook.isAlive())
+ throw new IllegalArgumentException("Hook already running");
+
+ if (hooks.containsKey(hook))
+ throw new IllegalArgumentException("Hook previously registered");
+
+ hooks.put(hook, hook);
+ }
+}
+//它含数据结构和逻辑管理虚拟机关闭序列
+class Shutdown {
+ /* Shutdown 系列状态*/
+ private static final int RUNNING = 0;
+ private static final int HOOKS = 1;
+ private static final int FINALIZERS = 2;
+ private static int state = RUNNING;
+ /* 是否应该运行所以finalizers来exit? */
+ private static boolean runFinalizersOnExit = false;
+ // 系统关闭钩子注册一个预定义的插槽.
+ // 关闭钩子的列表如下:
+ // (0) Console restore hook
+ // (1) Application hooks
+ // (2) DeleteOnExit hook
+ private static final int MAX_SYSTEM_HOOKS = 10;
+ private static final Runnable[] hooks = new Runnable[MAX_SYSTEM_HOOKS];
+ // 当前运行关闭钩子的钩子的索引
+ private static int currentRunningHook = 0;
+ /* 前面的静态字段由这个锁保护 */
+ private static class Lock { };
+ private static Object lock = new Lock();
+
+ /* 为native halt方法提供锁对象 */
+ private static Object haltLock = new Lock();
+
+ static void add(int slot, boolean registerShutdownInProgress, Runnable hook) {
+ synchronized (lock) {
+ if (hooks[slot] != null)
+ throw new InternalError("Shutdown hook at slot " + slot + " already registered");
+
+ if (!registerShutdownInProgress) {//执行shutdown过程中不添加hook
+ if (state > RUNNING)//如果已经在执行shutdown操作不能添加hook
+ throw new IllegalStateException("Shutdown in progress");
+ } else {//如果hooks已经执行完毕不能再添加hook。如果正在执行hooks时,添加的槽点小于当前执行的槽点位置也不能添加
+ if (state > HOOKS || (state == HOOKS && slot <= currentRunningHook))
+ throw new IllegalStateException("Shutdown in progress");
+ }
+
+ hooks[slot] = hook;
+ }
+ }
+ /* 执行所有注册的hooks
+ */
+ private static void runHooks() {
+ for (int i=0; i < MAX_SYSTEM_HOOKS; i++) {
+ try {
+ Runnable hook;
+ synchronized (lock) {
+ // acquire the lock to make sure the hook registered during
+ // shutdown is visible here.
+ currentRunningHook = i;
+ hook = hooks[i];
+ }
+ if (hook != null) hook.run();
+ } catch(Throwable t) {
+ if (t instanceof ThreadDeath) {
+ ThreadDeath td = (ThreadDeath)t;
+ throw td;
+ }
+ }
+ }
+ }
+ /* 关闭JVM的操作
+ */
+ static void halt(int status) {
+ synchronized (haltLock) {
+ halt0(status);
+ }
+ }
+ //JNI方法
+ static native void halt0(int status);
+ // shutdown的执行顺序:runHooks > runFinalizersOnExit
+ private static void sequence() {
+ synchronized (lock) {
+ /* Guard against the possibility of a daemon thread invoking exit
+ * after DestroyJavaVM initiates the shutdown sequence
+ */
+ if (state != HOOKS) return;
+ }
+ runHooks();
+ boolean rfoe;
+ synchronized (lock) {
+ state = FINALIZERS;
+ rfoe = runFinalizersOnExit;
+ }
+ if (rfoe) runAllFinalizers();
+ }
+ //Runtime.exit时执行,runHooks > runFinalizersOnExit > halt
+ static void exit(int status) {
+ boolean runMoreFinalizers = false;
+ synchronized (lock) {
+ if (status != 0) runFinalizersOnExit = false;
+ switch (state) {
+ case RUNNING: /* Initiate shutdown */
+ state = HOOKS;
+ break;
+ case HOOKS: /* Stall and halt */
+ break;
+ case FINALIZERS:
+ if (status != 0) {
+ /* Halt immediately on nonzero status */
+ halt(status);
+ } else {
+ /* Compatibility with old behavior:
+ * Run more finalizers and then halt
+ */
+ runMoreFinalizers = runFinalizersOnExit;
+ }
+ break;
+ }
+ }
+ if (runMoreFinalizers) {
+ runAllFinalizers();
+ halt(status);
+ }
+ synchronized (Shutdown.class) {
+ /* Synchronize on the class object, causing any other thread
+ * that attempts to initiate shutdown to stall indefinitely
+ */
+ sequence();
+ halt(status);
+ }
+ }
+ //shutdown操作,与exit不同的是不做halt操作(关闭JVM)
+ static void shutdown() {
+ synchronized (lock) {
+ switch (state) {
+ case RUNNING: /* Initiate shutdown */
+ state = HOOKS;
+ break;
+ case HOOKS: /* Stall and then return */
+ case FINALIZERS:
+ break;
+ }
+ }
+ synchronized (Shutdown.class) {
+ sequence();
+ }
+ }
+}
+```
+### 4 Spring中进行的处理和封装 spring 3.2.12
+- 在spring中通过ContextClosedEvent事件来触发一些动作(可以拓展),主要通过LifecycleProcessor.onClose来做stopBeans。
+- 由此可见spring也基于jvm做了拓展。
+```java
+public abstract class AbstractApplicationContext extends DefaultResourceLoader {
+ public void registerShutdownHook() {
+ if (this.shutdownHook == null) {
+ // No shutdown hook registered yet.
+ this.shutdownHook = new Thread() {
+ @Override
+ public void run() {
+ doClose();
+ }
+ };
+ Runtime.getRuntime().addShutdownHook(this.shutdownHook);
+ }
+ }
+ protected void doClose() {
+ boolean actuallyClose;
+ synchronized (this.activeMonitor) {
+ actuallyClose = this.active && !this.closed;
+ this.closed = true;
+ }
+
+ if (actuallyClose) {
+ if (logger.isInfoEnabled()) {
+ logger.info("Closing " + this);
+ }
+
+ LiveBeansView.unregisterApplicationContext(this);
+
+ try {
+ //发布应用内的关闭事件
+ publishEvent(new ContextClosedEvent(this));
+ }
+ catch (Throwable ex) {
+ logger.warn("Exception thrown from ApplicationListener handling ContextClosedEvent", ex);
+ }
+
+ // 停止所有的Lifecycle beans.
+ try {
+ getLifecycleProcessor().onClose();
+ }
+ catch (Throwable ex) {
+ logger.warn("Exception thrown from LifecycleProcessor on context close", ex);
+ }
+
+ // 销毁spring 的 BeanFactory可能会缓存单例的 Bean.
+ destroyBeans();
+
+ // 关闭当前应用上下文(BeanFactory)
+ closeBeanFactory();
+
+ // 执行子类的关闭逻辑
+ onClose();
+
+ synchronized (this.activeMonitor) {
+ this.active = false;
+ }
+ }
+ }
+}
+public interface LifecycleProcessor extends Lifecycle {
+ /**
+ * Notification of context refresh, e.g. for auto-starting components.
+ */
+ void onRefresh();
+
+ /**
+ * Notification of context close phase, e.g. for auto-stopping components.
+ */
+ void onClose();
+}
+```
+### 5 Spring boot中的扩展
+- 到这里就进入重点了,spring boot中有spring-boot-starter-actuator 模块提供了一个 restful 接口,用于优雅停机。
+- 执行请求 curl -X POST http://127.0.0.1:8088/shutdown ,待关闭成功则返回提示。
+- 注:线上环境该url需要设置权限,可配合 spring-security使用或在nginx中限制内网访问
+```properties
+#启用shutdown
+endpoints.shutdown.enabled=true
+#禁用密码验证
+endpoints.shutdown.sensitive=false
+#可统一指定所有endpoints的路径
+management.context-path=/manage
+#指定管理端口和IP
+management.port=8088
+management.address=127.0.0.1
+
+#开启shutdown的安全验证(spring-security)
+endpoints.shutdown.sensitive=true
+#验证用户名
+security.user.name=admin
+#验证密码
+security.user.password=secret
+#角色
+management.security.role=SUPERUSER
+```
+- spring boot的shutdown原理也不复杂,其实还是通过调用AbstractApplicationContext.close实现的。
+```java
+@ConfigurationProperties(
+ prefix = "endpoints.shutdown"
+)
+public class ShutdownMvcEndpoint extends EndpointMvcAdapter {
+ public ShutdownMvcEndpoint(ShutdownEndpoint delegate) {
+ super(delegate);
+ }
+ //post请求
+ @PostMapping(
+ produces = {"application/vnd.spring-boot.actuator.v1+json", "application/json"}
+ )
+ @ResponseBody
+ public Object invoke() {
+ return !this.getDelegate().isEnabled() ? new ResponseEntity(Collections.singletonMap("message", "This endpoint is disabled"), HttpStatus.NOT_FOUND) : super.invoke();
+ }
+}
+@ConfigurationProperties(
+ prefix = "endpoints.shutdown"
+)
+public class ShutdownEndpoint extends AbstractEndpoint