From 3f631e094929be52e1f992995b5d59b272456214 Mon Sep 17 00:00:00 2001 From: qyx <565485304@qq.com> Date: Mon, 11 Apr 2022 15:50:43 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD](master):?= =?UTF-8?q?=20=E6=9B=B4=E6=96=B0=E4=BA=86=E4=B8=80=E4=BA=9B=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E6=A8=A1=E5=BC=8F=E7=9A=84=E4=BB=A3=E7=A0=81=E5=8F=8A?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=8D=9A=E5=AE=A2=E5=86=85=E5=AE=B9=E7=9A=84?= =?UTF-8?q?=E6=94=B6=E9=9B=86=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev-protocol-design-pattern/README.md | 75 +++ .../pic/单例-DoubleCheck.png | Bin 0 -> 157847 bytes .../behavioral/interpreter/Interpreter.java | 5 - .../chainofresponsibility/Approver.java | 2 +- .../ArticleApprover.java | 2 +- .../chainofresponsibility/Course.java | 2 +- .../chainofresponsibility/Test.java | 2 +- .../chainofresponsibility/VideoApprover.java | 2 +- .../interpreter/AddInterpreter.java | 2 +- .../behavioral/interpreter/Interpreter.java | 5 + .../interpreter/MultiInterpreter.java | 2 +- .../interpreter/MyExpressionParse.java | 2 +- .../interpreter/NumberInterpreter.java | 2 +- .../behavioral/interpreter/OpratorUtil.java | 2 +- .../behavioral/interpreter/Test.java | 2 +- .../behavioral/iterator/Course.java | 2 +- .../behavioral/iterator/CourseAggregate.java | 2 +- .../iterator/CourseAggregateImpl.java | 2 +- .../behavioral/iterator/CourseIterator.java | 2 +- .../iterator/CourseIteratorImpl.java | 2 +- .../behavioral/iterator/Test.java | 2 +- .../behavioral/mediator/StudyGroup.java | 2 +- .../behavioral/mediator/Test.java | 2 +- .../behavioral/mediator/User.java | 2 +- .../behavioral/memento/Article.java | 2 +- .../behavioral/memento/ArticleMemento.java | 2 +- .../memento/ArticleMementoManager.java | 2 +- .../behavioral/memento/Test.java | 2 +- .../behavioral/observer/Course.java | 2 +- .../behavioral/observer/Question.java | 2 +- .../behavioral/observer/Teacher.java | 2 +- .../behavioral/observer/Test.java | 2 +- .../behavioral/state/CourseVideoContext.java | 2 +- .../behavioral/state/CourseVideoState.java | 2 +- .../behavioral/state/PauseState.java | 2 +- .../behavioral/state/PlayState.java | 2 +- .../behavioral/state/SpeedState.java | 2 +- .../behavioral/state/StopState.java | 2 +- .../{ => pattern}/behavioral/state/Test.java | 2 +- .../strategy/EmptyPromotionStrategy.java | 2 +- .../strategy/FanxianPromotionStrategy.java | 2 +- .../strategy/LIjianPromotionStrategy.java | 2 +- .../strategy/ManjianPromotionStrategy.java | 2 +- .../strategy/PromotionActivity.java | 2 +- .../strategy/PromotionStrategy.java | 2 +- .../strategy/PromotionStrategyFactory.java | 2 +- .../behavioral/strategy/Test.java | 2 +- .../behavioral/templatemethod/ACourse.java | 2 +- .../templatemethod/DesignPatternCourse.java | 2 +- .../behavioral/templatemethod/FECourse.java | 2 +- .../behavioral/templatemethod/Test.java | 2 +- .../behavioral/visitor/CodingCourse.java | 2 +- .../behavioral/visitor/Course.java | 2 +- .../behavioral/visitor/FreeCourse.java | 2 +- .../behavioral/visitor/IVisitor.java | 2 +- .../behavioral/visitor/Test.java | 2 +- .../behavioral/visitor/Visitor.java | 2 +- .../lazy/LazyDoubleCheckSingleton.java | 34 ++ .../singleton/lazy/LazySingleton.java | 27 ++ .../pattern/creational/singleton/lazy/T.java | 9 + .../creational/singleton/lazy/Test.java | 12 + .../adapter/clazzadapter}/Adaptee.java | 2 +- .../adapter/clazzadapter/Adapter.java | 2 +- .../adapter/clazzadapter/ConcreteTarget.java | 2 +- .../adapter/clazzadapter/Target.java | 5 + .../structural/adapter/clazzadapter/Test.java | 2 +- .../adapter/objectadapter}/Adaptee.java | 2 +- .../adapter/objectadapter/Adapter.java | 2 +- .../adapter/objectadapter/ConcreteTarget.java | 2 +- .../adapter/objectadapter/Target.java | 5 + .../adapter/objectadapter/Test.java | 2 +- .../structural/bridge/ABCBank.java | 2 +- .../structural/bridge/Account.java | 2 +- .../{ => pattern}/structural/bridge/Bank.java | 2 +- .../structural/bridge/DepositAccount.java | 2 +- .../structural/bridge/ICBCBank.java | 2 +- .../structural/bridge/SavingAccount.java | 2 +- .../{ => pattern}/structural/bridge/Test.java | 2 +- .../composite/CatalogComponent.java | 2 +- .../structural/composite/Course.java | 2 +- .../structural/composite/CourseCatalog.java | 2 +- .../structural/composite/Test.java | 2 +- .../structural/decorator/v1/Battercake.java | 2 +- .../decorator/v1/BattercakeWithEgg.java | 2 +- .../v1/BattercakeWithEggSausage.java | 2 +- .../structural/decorator/v1/Test.java | 2 +- .../structural/decorator/v2/ABattercake.java | 2 +- .../decorator/v2/AbstractDecorator.java | 2 +- .../decorator/v2/AbstractDecorator2.java | 2 +- .../structural/decorator/v2/Battercake.java | 2 +- .../structural/decorator/v2/EggDecorator.java | 2 +- .../decorator/v2/SausageDecorator.java | 2 +- .../structural/decorator/v2/Test.java | 2 +- .../facade/GiftExchangeService.java | 21 + .../pattern/structural/facade/PointsGift.java | 13 + .../facade/PointsPaymentService.java | 10 + .../structural/facade/QualifyService.java | 12 + .../structural/facade/ShippingService.java | 10 + .../pattern/structural/facade/Test.java | 14 + .../structural/flyweight/Employee.java | 5 + .../structural/flyweight/EmployeeFactory.java | 2 +- .../structural/flyweight/Manager.java | 2 +- .../structural/flyweight/Test.java | 2 +- .../adapter/clazzadapter/Target.java | 5 - .../adapter/objectadapter/Target.java | 5 - .../design/structural/flyweight/Employee.java | 5 - dev-protocol-extend/java-call-other/README.md | 20 + dev-protocol-extend/java-call-other/pom.xml | 35 ++ .../baiye/demo1/JavaCallPythonSimpleTest.java | 101 ++++ .../src/test/java/com/baiye/demo1/test.py | 1 + .../src/test/java/com/baiye/demo1/test1.py | 51 ++ dev-protocol-extend/pom.xml | 20 + dev-protocol-springboot/pom.xml | 19 + .../main/java/com/baiye/retry/file/README.md | 92 ++++ .../java/com/baiye/shutdown/file/README.md | 437 ++++++++++++++++++ pom.xml | 3 + 116 files changed, 1122 insertions(+), 106 deletions(-) create mode 100644 dev-protocol-design-pattern/pic/单例-DoubleCheck.png delete mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/interpreter/Interpreter.java rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/chainofresponsibility/Approver.java (83%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/chainofresponsibility/ArticleApprover.java (88%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/chainofresponsibility/Course.java (91%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/chainofresponsibility/Test.java (89%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/chainofresponsibility/VideoApprover.java (87%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/interpreter/AddInterpreter.java (90%) create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/behavioral/interpreter/Interpreter.java rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/interpreter/MultiInterpreter.java (90%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/interpreter/MyExpressionParse.java (96%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/interpreter/NumberInterpreter.java (87%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/interpreter/OpratorUtil.java (91%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/interpreter/Test.java (85%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/iterator/Course.java (76%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/iterator/CourseAggregate.java (82%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/iterator/CourseAggregateImpl.java (91%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/iterator/CourseIterator.java (63%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/iterator/CourseIteratorImpl.java (92%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/iterator/Test.java (96%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/mediator/StudyGroup.java (81%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/mediator/Test.java (80%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/mediator/User.java (86%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/memento/Article.java (96%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/memento/ArticleMemento.java (93%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/memento/ArticleMementoManager.java (88%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/memento/Test.java (96%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/observer/Course.java (91%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/observer/Question.java (89%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/observer/Teacher.java (91%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/observer/Test.java (91%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/state/CourseVideoContext.java (95%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/state/CourseVideoState.java (89%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/state/PauseState.java (92%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/state/PlayState.java (91%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/state/SpeedState.java (91%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/state/StopState.java (90%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/state/Test.java (95%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/strategy/EmptyPromotionStrategy.java (75%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/strategy/FanxianPromotionStrategy.java (79%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/strategy/LIjianPromotionStrategy.java (79%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/strategy/ManjianPromotionStrategy.java (77%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/strategy/PromotionActivity.java (84%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/strategy/PromotionStrategy.java (54%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/strategy/PromotionStrategyFactory.java (95%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/strategy/Test.java (93%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/templatemethod/ACourse.java (93%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/templatemethod/DesignPatternCourse.java (83%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/templatemethod/FECourse.java (91%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/templatemethod/Test.java (89%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/visitor/CodingCourse.java (87%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/visitor/Course.java (82%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/visitor/FreeCourse.java (71%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/visitor/IVisitor.java (68%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/visitor/Test.java (91%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/behavioral/visitor/Visitor.java (92%) create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/LazyDoubleCheckSingleton.java create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/LazySingleton.java create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/T.java create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/creational/singleton/lazy/Test.java rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{structural/adapter/objectadapter => pattern/structural/adapter/clazzadapter}/Adaptee.java (64%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/adapter/clazzadapter/Adapter.java (84%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/adapter/clazzadapter/ConcreteTarget.java (70%) create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/clazzadapter/Target.java rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/adapter/clazzadapter/Test.java (81%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{structural/adapter/clazzadapter => pattern/structural/adapter/objectadapter}/Adaptee.java (63%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/adapter/objectadapter/Adapter.java (82%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/adapter/objectadapter/ConcreteTarget.java (70%) create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/adapter/objectadapter/Target.java rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/adapter/objectadapter/Test.java (76%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/bridge/ABCBank.java (84%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/bridge/Account.java (62%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/bridge/Bank.java (81%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/bridge/DepositAccount.java (85%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/bridge/ICBCBank.java (84%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/bridge/SavingAccount.java (85%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/bridge/Test.java (87%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/composite/CatalogComponent.java (93%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/composite/Course.java (90%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/composite/CourseCatalog.java (93%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/composite/Test.java (68%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/decorator/v1/Battercake.java (71%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/decorator/v1/BattercakeWithEgg.java (80%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/decorator/v1/BattercakeWithEggSausage.java (81%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/decorator/v1/Test.java (92%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/decorator/v2/ABattercake.java (66%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/decorator/v2/AbstractDecorator.java (87%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/decorator/v2/AbstractDecorator2.java (91%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/decorator/v2/Battercake.java (77%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/decorator/v2/EggDecorator.java (85%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/decorator/v2/SausageDecorator.java (85%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/decorator/v2/Test.java (86%) create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/GiftExchangeService.java create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/PointsGift.java create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/PointsPaymentService.java create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/QualifyService.java create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/ShippingService.java create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/facade/Test.java create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/pattern/structural/flyweight/Employee.java rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/flyweight/EmployeeFactory.java (93%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/flyweight/Manager.java (89%) rename dev-protocol-design-pattern/src/main/java/com/baiye/design/{ => pattern}/structural/flyweight/Test.java (93%) delete mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Target.java delete mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Target.java delete mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Employee.java create mode 100644 dev-protocol-extend/java-call-other/README.md create mode 100644 dev-protocol-extend/java-call-other/pom.xml create mode 100644 dev-protocol-extend/java-call-other/src/test/java/com/baiye/demo1/JavaCallPythonSimpleTest.java create mode 100644 dev-protocol-extend/java-call-other/src/test/java/com/baiye/demo1/test.py create mode 100644 dev-protocol-extend/java-call-other/src/test/java/com/baiye/demo1/test1.py create mode 100644 dev-protocol-extend/pom.xml create mode 100644 dev-protocol-springboot/pom.xml create mode 100644 dev-protocol-springboot/src/main/java/com/baiye/retry/file/README.md create mode 100644 dev-protocol-springboot/src/main/java/com/baiye/shutdown/file/README.md 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 0000000000000000000000000000000000000000..cd8e3c104ee46ffbb39eead299ec0591aa4bda33 GIT binary patch literal 157847 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 z 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 BAHe_s literal 0 HcmV?d00001 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> implements ApplicationContextAware { + private static final Map NO_CONTEXT_MESSAGE = Collections.unmodifiableMap(Collections.singletonMap("message", "No context to shutdown.")); + private static final Map SHUTDOWN_MESSAGE = Collections.unmodifiableMap(Collections.singletonMap("message", "Shutting down, bye...")); + private ConfigurableApplicationContext context; + + public ShutdownEndpoint() { + super("shutdown", true, false); + } + //执行关闭 + public Map invoke() { + if (this.context == null) { + return NO_CONTEXT_MESSAGE; + } else { + boolean var6 = false; + + Map var1; + + class NamelessClass_1 implements Runnable { + NamelessClass_1() { + } + + public void run() { + try { + Thread.sleep(500L); + } catch (InterruptedException var2) { + Thread.currentThread().interrupt(); + } + //这个调用的就是AbstractApplicationContext.close + ShutdownEndpoint.this.context.close(); + } + } + + try { + var6 = true; + var1 = SHUTDOWN_MESSAGE; + var6 = false; + } finally { + if (var6) { + Thread thread = new Thread(new NamelessClass_1()); + thread.setContextClassLoader(this.getClass().getClassLoader()); + thread.start(); + } + } + + Thread thread = new Thread(new NamelessClass_1()); + thread.setContextClassLoader(this.getClass().getClassLoader()); + thread.start(); + return var1; + } + } +} +``` \ No newline at end of file diff --git a/pom.xml b/pom.xml index a5df16b..137d91e 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,9 @@ jpa/dev-protocol-jpa-auditing3 jpa/dev-protocol-jpa-entity-callback dev-protocol-design-pattern + dev-protocol-springboot + dev-protocol-extend + dev-protocol-extend/java-call-other