From ee0e9609f70c70ba59ebc90009edebb189fd4304 Mon Sep 17 00:00:00 2001
From: qyx <565485304@qq.com>
Date: Fri, 11 Mar 2022 14:12:38 +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?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. 状态,访问者,责任链模式
2. 装饰者,适配器,享元,组合模式
-
ps : 组合模式还需要进一步学习下
---
dev-protocol-design-pattern/.gitignore | 46 ++++
dev-protocol-design-pattern/README.md | 214 ++++++++++++++++++
dev-protocol-design-pattern/pom.xml | 19 ++
.../chainofresponsibility/Approver.java | 18 ++
.../ArticleApprover.java | 17 ++
.../chainofresponsibility/Course.java | 43 ++++
.../chainofresponsibility/Test.java | 20 ++
.../chainofresponsibility/VideoApprover.java | 16 ++
.../behavioral/state/CourseVideoContext.java | 37 +++
.../behavioral/state/CourseVideoState.java | 21 ++
.../design/behavioral/state/PauseState.java | 27 +++
.../design/behavioral/state/PlayState.java | 23 ++
.../design/behavioral/state/SpeedState.java | 23 ++
.../design/behavioral/state/StopState.java | 23 ++
.../baiye/design/behavioral/state/Test.java | 22 ++
.../behavioral/visitor/CodingCourse.java | 22 ++
.../design/behavioral/visitor/Course.java | 16 ++
.../design/behavioral/visitor/FreeCourse.java | 8 +
.../design/behavioral/visitor/IVisitor.java | 8 +
.../baiye/design/behavioral/visitor/Test.java | 26 +++
.../design/behavioral/visitor/Visitor.java | 22 ++
.../adapter/clazzadapter/Adaptee.java | 7 +
.../adapter/clazzadapter/Adapter.java | 16 ++
.../adapter/clazzadapter/ConcreteTarget.java | 8 +
.../adapter/clazzadapter/Target.java | 5 +
.../structural/adapter/clazzadapter/Test.java | 13 ++
.../adapter/objectadapter/Adaptee.java | 7 +
.../adapter/objectadapter/Adapter.java | 14 ++
.../adapter/objectadapter/ConcreteTarget.java | 9 +
.../adapter/objectadapter/Target.java | 5 +
.../adapter/objectadapter/Test.java | 11 +
.../composite/CatalogComponent.java | 24 ++
.../design/structural/composite/Course.java | 27 +++
.../structural/composite/CourseCatalog.java | 36 +++
.../design/structural/composite/Test.java | 7 +
.../structural/decorator/v1/Battercake.java | 12 +
.../decorator/v1/BattercakeWithEgg.java | 14 ++
.../v1/BattercakeWithEggSausage.java | 14 ++
.../design/structural/decorator/v1/Test.java | 21 ++
.../structural/decorator/v2/ABattercake.java | 6 +
.../decorator/v2/AbstractDecorator.java | 23 ++
.../decorator/v2/AbstractDecorator2.java | 25 ++
.../structural/decorator/v2/Battercake.java | 13 ++
.../structural/decorator/v2/EggDecorator.java | 18 ++
.../decorator/v2/SausageDecorator.java | 17 ++
.../design/structural/decorator/v2/Test.java | 11 +
.../design/structural/flyweight/Employee.java | 5 +
.../structural/flyweight/EmployeeFactory.java | 23 ++
.../design/structural/flyweight/Manager.java | 22 ++
.../design/structural/flyweight/Test.java | 25 ++
pom.xml | 1 +
51 files changed, 1110 insertions(+)
create mode 100644 dev-protocol-design-pattern/.gitignore
create mode 100644 dev-protocol-design-pattern/README.md
create mode 100644 dev-protocol-design-pattern/pom.xml
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Approver.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/ArticleApprover.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Course.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Test.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/VideoApprover.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/CourseVideoContext.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/CourseVideoState.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/PauseState.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/PlayState.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/SpeedState.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/StopState.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/Test.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/CodingCourse.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Course.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/FreeCourse.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/IVisitor.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Test.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Visitor.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Adaptee.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Adapter.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/ConcreteTarget.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Target.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Test.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Adaptee.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Adapter.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/ConcreteTarget.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Target.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Test.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/CatalogComponent.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/Course.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/CourseCatalog.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/Test.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/Battercake.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/BattercakeWithEgg.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/BattercakeWithEggSausage.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/Test.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/ABattercake.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/AbstractDecorator.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/AbstractDecorator2.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/Battercake.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/EggDecorator.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/SausageDecorator.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/Test.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Employee.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/EmployeeFactory.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Manager.java
create mode 100644 dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Test.java
diff --git a/dev-protocol-design-pattern/.gitignore b/dev-protocol-design-pattern/.gitignore
new file mode 100644
index 0000000..d4beec9
--- /dev/null
+++ b/dev-protocol-design-pattern/.gitignore
@@ -0,0 +1,46 @@
+### Example user template template
+### Example user template
+
+# IntelliJ project files
+.idea
+*.iml
+out
+gen
+### Maven template
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
diff --git a/dev-protocol-design-pattern/README.md b/dev-protocol-design-pattern/README.md
new file mode 100644
index 0000000..72bacb7
--- /dev/null
+++ b/dev-protocol-design-pattern/README.md
@@ -0,0 +1,214 @@
+## 设计模式
+
+### 7大设计原则
+ 开闭原则
+ 依赖倒置原则
+ 单一职责原则
+ 接口隔离原则
+ 迪米特原则
+ 里氏替换原则
+ 合成复用原则
+### 设计模式 - 创建型模式
+ 工厂模式,抽象工厂模式,建造者模式,单例模式,原型模式
+### 设计模式 - 结构型模式
+ 适配器模式,装饰者模式,代理模式,外观模式,桥接模式,组合模式,享元模式
+### 设计模式 - 行为型模式
+ 策略模式,观察者模式,责任链模式,备忘录模式,模板方法模式,迭代器模式,中介者模式,命令模式,访问者模式,解释器模式,状态模式
+### UML类图
+- 记忆技巧
+ - 箭头方向 子类指向父类
+ - 实线继承 | 虚线实现(空心箭头)
+ - 实线关联 | 虚线依赖
+ - 空心菱形-聚合 | 实心菱形-组合
+### UML时序图
+- 记忆技巧
+ - 实心箭头-同步调用
+ - 线箭头-异步调用
+ - 虚线箭头-返回
+### UML类图讲解
+
+
+### 软件设计七大原则
+
+---
+
+### 装饰者模式
+
+#### 1 定义与类型
+ 定义: 在不改变原有对象的基础上,架构功能附加到对象上
+ 提供了比继承更有弹性的替代方案(扩展原有对象功能)
+ 类型:结构型
+
+#### 2 适用场景
+ 扩展一个类的功能或者给一个类添加附加职责
+ 动态的给一个对象添加功能,这些功能可以再动态的撤销
+
+#### 3 优点
+ 继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能
+ 通过使用不同装饰类及这些装饰类的排列组合,可以实现不同效果
+ 符合开闭原则
+
+#### 4 缺点
+ 会出现更多的代码,更多的类,增加程序的复杂性
+ 动态装饰时,多层装饰时会更复杂
+
+#### 5 相关的设计模式
+ 装饰者模式和代理模式
+ - 装饰者模式: 关注在一个对象上动态的添加方法
+ - 代理模式: 关注控制对对象的访问
+ 装饰者模式和适配器模式
+ - 装饰者模式:装饰者和被装饰者实现相同的接口或装饰者是被装饰者的子类,(也可以退化成半装饰者,装饰者还提供了其他的方法,但是不常用)
+ - 适配器模式: 适配器和被适配的类有不同的接口,也可能有部分的接口是重合的
+
+#### 6 代码
+ com.baiye.design.structural.decorator
+
+#### 7 总结
+ 以 Wapper 结尾的可能是装饰者或者适配器模式,具体看结构
+
+---
+### 适配器模式
+
+#### 1 定义和类型
+ 定义: 将一个类的接口转换成客户期望的另一个接口
+ 使原本接口不兼容的类可以一起工作
+ 类型:结构型
+#### 2 适用场景
+ 已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
+ 不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品,不同厂家造成功能类似而接口不相同情况下的解决方案
+#### 3 优点
+ 能提高类的透明性和复用性,现有的类复用但不需要改变
+ 目标类和适配器类解耦,提高程序的扩展性
+ 符合开闭原则
+#### 4 缺点
+ 适配器模式编写过程需要全面考虑,可能会增加系统的复杂性
+ 增加系统代码可读的难度
+#### 5 扩展
+ 对象适配器
+ 类适配器
+#### 6 相关的设计模式
+ 适配器和外观模式
+ - 外观是定义新的接口,适配器是复用一个原有的接口,适配器是让两个接口协同工作,外观是在现有的系统中提供一个访问入口
+
+#### 7 代码
+ com.baiye.design.structural.adapter
+
+---
+### 享元模式
+
+#### 1 定义和类型
+ 定义:提供了减少对象数量从而改善应用所需对象结构的方式
+ 运用共享技术有效地支持大量细粒度的对象
+ 类型: 结构型
+#### 2 使用场景
+ 常常应用于系统底层的开发,以便解决系统的性能问题
+ 系统有大量相似对象,需要缓冲池的场景
+#### 3 优点
+ 减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率
+ 减少内存之外的其他资源占用
+#### 4 缺点
+ 关注 内部/外部状态,关注线程安全问题
+ 使系统,程序的逻辑复杂化
+#### 5 扩展
+ 内部状态
+ 外部状态
+#### 6 相关的设计模式
+ 享元模式和代理模式
+ 享元模式和单例模式
+---
+### 组合模式
+
+#### 1 定义和类型
+ 定义:将对象组合成树形结构以表示“部分-整体”的层次结构
+ 组合模式使客户端对单个对象和组合对象保持一致的方式处理
+ 类型:结构型
+#### 2 适用场景
+ 希望客户端可以忽略组合对象与单个对象的差异时
+ 处理一个树形结构时
+#### 3 优点
+ 清除地定义分层次的复杂对象,表示对象的全部或部分层次
+ 让客户端忽略了层次的差异,方便对整个层次结构进行控制
+ 简化客户端代码
+ 符合开闭原则
+#### 4 缺点
+ 限制类型时会较为复杂
+ 使设计变得更加抽象
+#### 5 组合模式的相关设计模式
+ 组合模式和访问者模式
+ - 使用访问者模式可以访问组合模式中的递归结构
+#### 6 代码
+com.baiye.design.structural.composite
+
+---
+
+### 责任链模式
+
+#### 1 定义与类型
+ 为请求创建一个接收此次请求对象的链
+ 类型: 行为型
+#### 2 使用场景
+ 一个请求的处理需要多个对象当中的一个或多个协作处理
+#### 3 优点
+ 请求的发送者和接收者(请求的处理)解耦
+ 责任链可以动态组合
+#### 4 缺点
+ 责任链太长或者处理时间过长,影响性能
+ 责任链有可能过多
+#### 5 相关的设计模式
+ 责任链模式和状态模式
+ - 责任链模式不指定下一个处理的对象
+ - 状态模式是知道自己处理的下一个对象是谁
+#### 6 代码
+ com.baiye.design.behavioral.chainofresponsibility
+#### 7 总结
+ 责任链 -> 流程引擎
+ 一般责任链模式的都以Chain结尾
+---
+
+### 访问者模式
+
+#### 1 定义与类型
+ 封装作用于某数据结构(如List/Set/Map等)中的各元素的操作
+ 可以在不改变各元素类的前提下,定义作用于这些元素的操作
+ 类型:行为型
+#### 2 适用场景
+ 当一个数据结构(List/Set/Map等)包含很多类型对象
+ 数据结构与数据操作分离
+#### 3 优点
+ 增加新的操作很容易,即增加一个新的访问者
+#### 4 缺点
+ 增加新的数据结构困难
+ 具体元素的变更比较麻烦
+#### 5 相关设计模式
+ 访问者模式和迭代器模式
+ - 都是在某种数据结构上进行处理
+ - 访问者模式在对保存在数据结构中的元素进行某种特定处理
+ - 迭代器模式是逐步遍历保存在数据结构中的元素
+#### 6 coding
+ com.baiye.design.behavioral.visitor
+#### 7 总结
+ 不同角色的人对数据的访问不同
+ 一般以Visitor结尾的各种类
+---
+
+### 状态模式
+
+#### 1 定义与类型
+ 允许一个对象在其内部状态改变时,改变他的行为
+ 类型: 行为型
+#### 2 使用场景
+ 一个对象存在多个状态(不同状态下行为不同),且状态可相互转换
+#### 3 优点
+ 将不同的状态隔离
+ 把各种状态的转换逻辑,分布到State的子类中,减少相互间依赖
+ 增加新的状态非常简单
+#### 4 缺点
+ 状态多的业务场景导致类的数目增加,系统变复杂
+#### 5 相关的设计模式
+ 状态模式和享元模式
+ - 使用享元模式在多个状态上下文中共享这个模式
+#### 6 coding
+ com.baiye.design.behavioral.state
+#### 7 总结
+ 多个状态 -> 状态模式解决 -> 借助 状态机 解决
+
diff --git a/dev-protocol-design-pattern/pom.xml b/dev-protocol-design-pattern/pom.xml
new file mode 100644
index 0000000..cacee37
--- /dev/null
+++ b/dev-protocol-design-pattern/pom.xml
@@ -0,0 +1,19 @@
+
+
+
+ dev-protocol
+ org.example
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ dev-protocol-design-pattern
+
+
+ 8
+ 8
+
+
+
\ No newline at end of file
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/behavioral/chainofresponsibility/Approver.java
new file mode 100644
index 0000000..88a35b4
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Approver.java
@@ -0,0 +1,18 @@
+package com.baiye.design.behavioral.chainofresponsibility;
+
+public abstract class Approver {
+
+ /**
+ * 责任链模式里面会包含一个自己同样类型的对象
+ */
+ protected Approver approver;
+
+ public void setNextApprover(Approver approver) {
+ this.approver = approver;
+ }
+
+ /**
+ * 让子类去发布课程
+ */
+ public abstract void deploy(Course course);
+}
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/behavioral/chainofresponsibility/ArticleApprover.java
new file mode 100644
index 0000000..cb81007
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/ArticleApprover.java
@@ -0,0 +1,17 @@
+package com.baiye.design.behavioral.chainofresponsibility;
+
+
+public class ArticleApprover extends Approver{
+ @Override
+ public void deploy(Course course) {
+ if (course.getArticle() != null && !"".equals(course.getArticle())){
+ System.out.println(course.getName() + "含有手记,批准");
+ if (null != approver){
+ approver.deploy(course);
+ }
+ }else {
+ System.out.println(course.getName() + "不包含手记,不批准,流程结束!");
+ return;
+ }
+ }
+}
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/behavioral/chainofresponsibility/Course.java
new file mode 100644
index 0000000..cc9293b
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Course.java
@@ -0,0 +1,43 @@
+package com.baiye.design.behavioral.chainofresponsibility;
+
+public class Course {
+
+ private String name;
+
+ private String article;
+
+ private String video;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getArticle() {
+ return article;
+ }
+
+ public void setArticle(String article) {
+ this.article = article;
+ }
+
+ public String getVideo() {
+ return video;
+ }
+
+ public void setVideo(String video) {
+ this.video = video;
+ }
+
+ @Override
+ public String toString() {
+ return "Course{" +
+ "name='" + name + '\'' +
+ ", article='" + article + '\'' +
+ ", video='" + video + '\'' +
+ '}';
+ }
+}
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/behavioral/chainofresponsibility/Test.java
new file mode 100644
index 0000000..aa1c36a
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/Test.java
@@ -0,0 +1,20 @@
+package com.baiye.design.behavioral.chainofresponsibility;
+
+public class Test {
+ public static void main(String[] args) {
+ Approver articleApprover = new ArticleApprover();
+ Approver videoApprover = new VideoApprover();
+
+ Course course = new Course();
+ course.setName("Java设计模式精讲");
+// course.setArticle("Java设计模式精讲的手记");
+ course.setVideo("Java设计模式精讲的视频");
+
+ // 顺序交给客户端进行处理
+
+ // 设置下一个审核人
+ articleApprover.setNextApprover(videoApprover);
+ // 发布课程
+ articleApprover.deploy(course);
+ }
+}
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/behavioral/chainofresponsibility/VideoApprover.java
new file mode 100644
index 0000000..a09957b
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/chainofresponsibility/VideoApprover.java
@@ -0,0 +1,16 @@
+package com.baiye.design.behavioral.chainofresponsibility;
+
+public class VideoApprover extends Approver{
+ @Override
+ public void deploy(Course course) {
+ if (course.getVideo() != null && !"".equals(course.getVideo())){
+ System.out.println(course.getName() + "含有视频,批准");
+ if (null != approver){
+ approver.deploy(course);
+ }
+ }else {
+ System.out.println(course.getName() + "不包含视频,不批准,流程结束!");
+ return;
+ }
+ }
+}
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/behavioral/state/CourseVideoContext.java
new file mode 100644
index 0000000..2b153b7
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/CourseVideoContext.java
@@ -0,0 +1,37 @@
+package com.baiye.design.behavioral.state;
+
+public class CourseVideoContext {
+
+ /**
+ * 组合一个课程视频的状态
+ */
+ private CourseVideoState courseVideoState;
+
+ public static final PlayState PLAY_STATE = new PlayState();
+ public static final PauseState PAUSE_STATE = new PauseState();
+ public static final SpeedState SPEED_STATE = new SpeedState();
+ public static final StopState STOP_STATE = new StopState();
+
+ public CourseVideoState getCourseVideoState() {
+ return courseVideoState;
+ }
+
+ public void setCourseVideoState(CourseVideoState courseVideoState) {
+ this.courseVideoState = courseVideoState;
+ // 设置上下文
+ this.courseVideoState.setCourseVideoContext(this);
+ }
+
+ public void play(){
+ this.courseVideoState.play();
+ }
+ public void speed(){
+ this.courseVideoState.speed();
+ }
+ public void stop(){
+ this.courseVideoState.stop();
+ }
+ public void pause(){
+ this.courseVideoState.pause();
+ }
+}
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/behavioral/state/CourseVideoState.java
new file mode 100644
index 0000000..d514fb9
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/CourseVideoState.java
@@ -0,0 +1,21 @@
+package com.baiye.design.behavioral.state;
+
+public abstract class CourseVideoState {
+
+ /**
+ * 上下文
+ */
+ protected CourseVideoContext courseVideoContext;
+
+ public void setCourseVideoContext(CourseVideoContext courseVideoContext) {
+ this.courseVideoContext = courseVideoContext;
+ }
+
+ /**
+ * 播放器行为
+ */
+ public abstract void play();
+ public abstract void speed();
+ public abstract void pause();
+ public abstract void stop();
+}
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/behavioral/state/PauseState.java
new file mode 100644
index 0000000..64ca1a2
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/PauseState.java
@@ -0,0 +1,27 @@
+package com.baiye.design.behavioral.state;
+
+
+/**
+ * 其他的状态表示是可以进行切换的状态
+ */
+public class PauseState extends CourseVideoState{
+ @Override
+ public void play() {
+ super.courseVideoContext.setCourseVideoState(CourseVideoContext.PLAY_STATE);
+ }
+
+ @Override
+ public void speed() {
+ super.courseVideoContext.setCourseVideoState(CourseVideoContext.SPEED_STATE);
+ }
+
+ @Override
+ public void pause() {
+ System.out.println("这是暂停状态");
+ }
+
+ @Override
+ public void stop() {
+ super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_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/behavioral/state/PlayState.java
new file mode 100644
index 0000000..c3312a6
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/PlayState.java
@@ -0,0 +1,23 @@
+package com.baiye.design.behavioral.state;
+
+public class PlayState extends CourseVideoState{
+ @Override
+ public void play() {
+ System.out.println("正常播放视频状态");
+ }
+
+ @Override
+ public void speed() {
+ super.courseVideoContext.setCourseVideoState(CourseVideoContext.SPEED_STATE);
+ }
+
+ @Override
+ public void pause() {
+ super.courseVideoContext.setCourseVideoState(CourseVideoContext.PAUSE_STATE);
+ }
+
+ @Override
+ public void stop() {
+ super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);
+ }
+}
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/behavioral/state/SpeedState.java
new file mode 100644
index 0000000..9edb093
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/SpeedState.java
@@ -0,0 +1,23 @@
+package com.baiye.design.behavioral.state;
+
+public class SpeedState extends CourseVideoState{
+ @Override
+ public void play() {
+ super.courseVideoContext.setCourseVideoState(CourseVideoContext.PLAY_STATE);
+ }
+
+ @Override
+ public void speed() {
+ System.out.println("这是快进状态");
+ }
+
+ @Override
+ public void pause() {
+ super.courseVideoContext.setCourseVideoState(CourseVideoContext.PAUSE_STATE);
+ }
+
+ @Override
+ public void stop() {
+ super.courseVideoContext.setCourseVideoState(CourseVideoContext.STOP_STATE);
+ }
+}
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/behavioral/state/StopState.java
new file mode 100644
index 0000000..ea2316a
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/StopState.java
@@ -0,0 +1,23 @@
+package com.baiye.design.behavioral.state;
+
+public class StopState extends CourseVideoState{
+ @Override
+ public void play() {
+ super.courseVideoContext.setCourseVideoState(CourseVideoContext.PLAY_STATE);
+ }
+
+ @Override
+ public void speed() {
+ System.out.println("ERROR 停止状态不能快进");
+ }
+
+ @Override
+ public void pause() {
+ System.out.println("ERROR 停止状态不能暂停");
+ }
+
+ @Override
+ public void stop() {
+ System.out.println("这是停止状态");
+ }
+}
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/behavioral/state/Test.java
new file mode 100644
index 0000000..d6d7ca3
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/state/Test.java
@@ -0,0 +1,22 @@
+package com.baiye.design.behavioral.state;
+
+public class Test {
+ public static void main(String[] args) {
+ CourseVideoContext courseVideoContext = new CourseVideoContext();
+ courseVideoContext.setCourseVideoState(new PlayState());
+ System.out.println("当前状态" + courseVideoContext.getCourseVideoState().getClass().getSimpleName());
+ // 进行切换状态
+ courseVideoContext.pause();
+ System.out.println("当前状态" + courseVideoContext.getCourseVideoState().getClass().getSimpleName());
+ // 进行切换状态
+ courseVideoContext.speed();
+ System.out.println("当前状态" + courseVideoContext.getCourseVideoState().getClass().getSimpleName());
+ // 进行切换状态
+ courseVideoContext.stop();
+ System.out.println("当前状态" + courseVideoContext.getCourseVideoState().getClass().getSimpleName());
+ // 可以对不能切换的状态进行限制
+ courseVideoContext.speed();
+
+ // todo 当需要新加一个状态的时候,只需要新加一个状态类即可
+ }
+}
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/behavioral/visitor/CodingCourse.java
new file mode 100644
index 0000000..fa53a11
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/CodingCourse.java
@@ -0,0 +1,22 @@
+package com.baiye.design.behavioral.visitor;
+
+public class CodingCourse extends Course{
+
+ /**
+ * 这个属性就是 两个课程的区别
+ */
+ private Integer price;
+
+ public Integer getPrice() {
+ return price;
+ }
+
+ public void setPrice(Integer price) {
+ this.price = price;
+ }
+
+ @Override
+ public void accept(IVisitor visitor) {
+ visitor.visit(this);
+ }
+}
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/behavioral/visitor/Course.java
new file mode 100644
index 0000000..c94a96b
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Course.java
@@ -0,0 +1,16 @@
+package com.baiye.design.behavioral.visitor;
+
+public abstract class Course {
+
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public abstract void accept(IVisitor visitor);
+}
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/behavioral/visitor/FreeCourse.java
new file mode 100644
index 0000000..bfa5805
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/FreeCourse.java
@@ -0,0 +1,8 @@
+package com.baiye.design.behavioral.visitor;
+
+public class FreeCourse extends Course{
+ @Override
+ public void accept(IVisitor visitor) {
+ visitor.visit(this);
+ }
+}
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/behavioral/visitor/IVisitor.java
new file mode 100644
index 0000000..93c8e64
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/IVisitor.java
@@ -0,0 +1,8 @@
+package com.baiye.design.behavioral.visitor;
+
+public interface IVisitor {
+
+ void visit(FreeCourse freeCourse);
+
+ void visit(CodingCourse codingCourse);
+}
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/behavioral/visitor/Test.java
new file mode 100644
index 0000000..c003dff
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Test.java
@@ -0,0 +1,26 @@
+package com.baiye.design.behavioral.visitor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Test {
+
+ public static void main(String[] args) {
+ List courseList = new ArrayList<>();
+
+ FreeCourse freeCourse = new FreeCourse();
+ freeCourse.setName("SpringMVC数据绑定");
+
+ CodingCourse codingCourse = new CodingCourse();
+ codingCourse.setName("Java设计模式精讲");
+ codingCourse.setPrice(299);
+
+ courseList.add(freeCourse);
+ courseList.add(codingCourse);
+
+
+ for (Course course : courseList) {
+ course.accept(new Visitor());
+ }
+ }
+}
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/behavioral/visitor/Visitor.java
new file mode 100644
index 0000000..4ac499f
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/behavioral/visitor/Visitor.java
@@ -0,0 +1,22 @@
+package com.baiye.design.behavioral.visitor;
+
+public class Visitor implements IVisitor{
+
+ /**
+ * 免费课程,打印所有免费课程名称
+ */
+ @Override
+ public void visit(FreeCourse freeCourse) {
+ // todo 这里可以对是否可以进行访问进行逻辑判断
+ System.out.println(freeCourse.getName());
+ }
+
+ /**
+ * 实战课程,打印所有实战课程的名称和价格
+ */
+ @Override
+ public void visit(CodingCourse codingCourse) {
+ // todo 这里可以对是否可以进行访问进行逻辑判断
+ System.out.println(codingCourse.getName() + "|" + codingCourse.getPrice());
+ }
+}
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/structural/adapter/clazzadapter/Adaptee.java
new file mode 100644
index 0000000..77c2e9c
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Adaptee.java
@@ -0,0 +1,7 @@
+package com.baiye.design.structural.adapter.clazzadapter;
+
+public class Adaptee {
+ public void adapteeRequest(){
+ System.out.println("被适配者的方法");
+ }
+}
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/structural/adapter/clazzadapter/Adapter.java
new file mode 100644
index 0000000..fbe6441
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Adapter.java
@@ -0,0 +1,16 @@
+package com.baiye.design.structural.adapter.clazzadapter;
+
+/**
+ * 适配器 把Adaptee的方法适配给Target接口
+ *
+ * @author q
+ * @date 2022/03/10
+ */
+public class Adapter extends Adaptee implements Target{
+ @Override
+ public void request() {
+ // 。。 在这里可以增加一些逻辑代码
+ super.adapteeRequest();
+ // 。。 在这里可以增加一些逻辑代码
+ }
+}
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/structural/adapter/clazzadapter/ConcreteTarget.java
new file mode 100644
index 0000000..3238aa5
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/ConcreteTarget.java
@@ -0,0 +1,8 @@
+package com.baiye.design.structural.adapter.clazzadapter;
+
+public class ConcreteTarget implements Target{
+ @Override
+ public void request() {
+ System.out.println("ConcreteTarget 目标方法");
+ }
+}
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
new file mode 100644
index 0000000..273f805
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Target.java
@@ -0,0 +1,5 @@
+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/clazzadapter/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Test.java
new file mode 100644
index 0000000..c3c897f
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/clazzadapter/Test.java
@@ -0,0 +1,13 @@
+package com.baiye.design.structural.adapter.clazzadapter;
+
+public class Test {
+ public static void main(String[] args) {
+ // 适配的类实现
+ Target adapter = new Adapter();
+ adapter.request();
+
+ // 原始的实现
+ Target concreteTarget = new ConcreteTarget();
+ concreteTarget.request();
+ }
+}
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/structural/adapter/objectadapter/Adaptee.java
new file mode 100644
index 0000000..4e73905
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Adaptee.java
@@ -0,0 +1,7 @@
+package com.baiye.design.structural.adapter.objectadapter;
+
+public class Adaptee {
+ public void adapteeRequest(){
+ System.out.println("被适配者的方法");
+ }
+}
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/structural/adapter/objectadapter/Adapter.java
new file mode 100644
index 0000000..514021b
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Adapter.java
@@ -0,0 +1,14 @@
+package com.baiye.design.structural.adapter.objectadapter;
+
+public class Adapter implements Target{
+
+ // 把 Adaptee 组合在这里
+ private Adaptee adaptee = new Adaptee();
+
+ @Override
+ public void request() {
+ // 。。 在这里可以增加一些逻辑代码
+ adaptee.adapteeRequest();
+ // 。。 在这里可以增加一些逻辑代码
+ }
+}
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/structural/adapter/objectadapter/ConcreteTarget.java
new file mode 100644
index 0000000..20a866a
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/ConcreteTarget.java
@@ -0,0 +1,9 @@
+package com.baiye.design.structural.adapter.objectadapter;
+
+
+public class ConcreteTarget implements Target{
+ @Override
+ public void request() {
+ System.out.println("ConcreteTarget 目标方法");
+ }
+}
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
new file mode 100644
index 0000000..b192af0
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Target.java
@@ -0,0 +1,5 @@
+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/adapter/objectadapter/Test.java b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Test.java
new file mode 100644
index 0000000..75b41ff
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/adapter/objectadapter/Test.java
@@ -0,0 +1,11 @@
+package com.baiye.design.structural.adapter.objectadapter;
+
+public class Test {
+ public static void main(String[] args) {
+ Target target = new ConcreteTarget();
+ target.request();
+
+ Target adapter = new Adapter();
+ adapter.request();
+ }
+}
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/structural/composite/CatalogComponent.java
new file mode 100644
index 0000000..c65f6e4
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/CatalogComponent.java
@@ -0,0 +1,24 @@
+package com.baiye.design.structural.composite;
+
+public abstract class CatalogComponent {
+
+ public void add(CatalogComponent catalogComponent) {
+ throw new UnsupportedOperationException("不支持添加操作");
+ }
+
+ public void remove(CatalogComponent catalogComponent) {
+ throw new UnsupportedOperationException("不支持删除操作");
+ }
+
+ public String getName(CatalogComponent catalogComponent) {
+ throw new UnsupportedOperationException("不支持获取名称操作");
+ }
+
+ public double getPrice(CatalogComponent catalogComponent) {
+ throw new UnsupportedOperationException("不支持获取价格操作");
+ }
+
+ public void print() {
+ throw new UnsupportedOperationException("不支持打印操作");
+ }
+}
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/structural/composite/Course.java
new file mode 100644
index 0000000..187f88b
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/Course.java
@@ -0,0 +1,27 @@
+package com.baiye.design.structural.composite;
+
+public class Course extends CatalogComponent{
+
+ private String name;
+ private Double price;
+
+ public Course(String name, Double price) {
+ this.name = name;
+ this.price = price;
+ }
+
+ @Override
+ public String getName(CatalogComponent catalogComponent) {
+ return this.name;
+ }
+
+ @Override
+ public double getPrice(CatalogComponent catalogComponent) {
+ return this.price;
+ }
+
+ @Override
+ public void print() {
+ System.out.println("Course name : " + name + "Price : " + price);
+ }
+}
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/structural/composite/CourseCatalog.java
new file mode 100644
index 0000000..227bff5
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/CourseCatalog.java
@@ -0,0 +1,36 @@
+package com.baiye.design.structural.composite;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CourseCatalog extends CatalogComponent {
+
+ List list = new ArrayList<>();
+ private String name;
+
+ public CourseCatalog(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public void add(CatalogComponent catalogComponent) {
+ list.add(catalogComponent);
+ }
+
+ @Override
+ public void remove(CatalogComponent catalogComponent) {
+ list.remove(catalogComponent);
+ }
+
+ @Override
+ public void print() {
+ for (CatalogComponent catalogComponent : list) {
+ catalogComponent.print();
+ }
+ }
+
+ @Override
+ public String getName(CatalogComponent catalogComponent) {
+ return this.name;
+ }
+}
\ No newline at end of file
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/structural/composite/Test.java
new file mode 100644
index 0000000..2eff506
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/composite/Test.java
@@ -0,0 +1,7 @@
+package com.baiye.design.structural.composite;
+
+public class Test {
+ public static void main(String[] args) {
+ // TODO: 2022/3/11 0011 补充资料
+ }
+}
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/structural/decorator/v1/Battercake.java
new file mode 100644
index 0000000..27849b7
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/Battercake.java
@@ -0,0 +1,12 @@
+package com.baiye.design.structural.decorator.v1;
+
+public class Battercake {
+
+ protected String getDesc(){
+ return "煎饼";
+ }
+
+ protected int cost(){
+ return 8;
+ }
+}
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/structural/decorator/v1/BattercakeWithEgg.java
new file mode 100644
index 0000000..d17dae6
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/BattercakeWithEgg.java
@@ -0,0 +1,14 @@
+package com.baiye.design.structural.decorator.v1;
+
+public class BattercakeWithEgg extends Battercake{
+
+ @Override
+ protected String getDesc() {
+ return super.getDesc() + "加一个鸡蛋";
+ }
+
+ @Override
+ protected int cost() {
+ return super.cost() + 1;
+ }
+}
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/structural/decorator/v1/BattercakeWithEggSausage.java
new file mode 100644
index 0000000..74e92a7
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/BattercakeWithEggSausage.java
@@ -0,0 +1,14 @@
+package com.baiye.design.structural.decorator.v1;
+
+public class BattercakeWithEggSausage extends BattercakeWithEgg{
+
+ @Override
+ protected String getDesc() {
+ return super.getDesc() + "加一个香肠";
+ }
+
+ @Override
+ protected int cost() {
+ return super.cost() + 2;
+ }
+}
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/structural/decorator/v1/Test.java
new file mode 100644
index 0000000..0b224d1
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v1/Test.java
@@ -0,0 +1,21 @@
+package com.baiye.design.structural.decorator.v1;
+
+public class Test {
+
+ public static void main(String[] args) {
+ System.out.println(System.getProperty("file.encoding"));
+
+ Battercake battercake = new Battercake();
+ System.out.println(battercake.getDesc() + "销售价格 : " + battercake.cost());
+
+
+ Battercake battercakeWithEgg = new BattercakeWithEgg();
+ System.out.println(battercakeWithEgg.getDesc() + "销售价格 : " + battercakeWithEgg.cost());
+
+
+ Battercake battercakeWithEggSausage = new BattercakeWithEggSausage();
+ System.out.println(battercakeWithEggSausage.getDesc() + "销售价格 : " + battercakeWithEggSausage.cost());
+
+ // 有可能会出现类爆炸的情况
+ }
+}
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/structural/decorator/v2/ABattercake.java
new file mode 100644
index 0000000..26575cf
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/ABattercake.java
@@ -0,0 +1,6 @@
+package com.baiye.design.structural.decorator.v2;
+
+public abstract class ABattercake {
+ protected abstract String getDesc();
+ protected abstract int cost();
+}
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/structural/decorator/v2/AbstractDecorator.java
new file mode 100644
index 0000000..4916db6
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/AbstractDecorator.java
@@ -0,0 +1,23 @@
+package com.baiye.design.structural.decorator.v2;
+
+/**
+ * @author Administrator
+ */
+public class AbstractDecorator extends ABattercake{
+
+ private ABattercake aBattercake;
+
+ public AbstractDecorator(ABattercake aBattercake) {
+ this.aBattercake = aBattercake;
+ }
+
+ @Override
+ protected String getDesc() {
+ return this.aBattercake.getDesc();
+ }
+
+ @Override
+ protected int cost() {
+ return this.aBattercake.cost();
+ }
+}
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/structural/decorator/v2/AbstractDecorator2.java
new file mode 100644
index 0000000..c2c5f3d
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/AbstractDecorator2.java
@@ -0,0 +1,25 @@
+package com.baiye.design.structural.decorator.v2;
+
+/**
+ * 装饰者类的第二种形式 对原装饰者进行修改,扩展到更多的方法
+ */
+public abstract class AbstractDecorator2 extends ABattercake{
+ private ABattercake aBattercake;
+
+ public AbstractDecorator2(ABattercake aBattercake) {
+ this.aBattercake = aBattercake;
+ }
+
+ // 扩展的方法,继承该装饰者的类就要实现对应的方法
+ protected abstract void doSomething();
+
+ @Override
+ protected String getDesc() {
+ return this.aBattercake.getDesc();
+ }
+
+ @Override
+ protected int cost() {
+ return this.aBattercake.cost();
+ }
+}
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/structural/decorator/v2/Battercake.java
new file mode 100644
index 0000000..9c6f8f9
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/Battercake.java
@@ -0,0 +1,13 @@
+package com.baiye.design.structural.decorator.v2;
+
+public class Battercake extends ABattercake{
+ @Override
+ protected String getDesc() {
+ return "一个煎饼";
+ }
+
+ @Override
+ protected int cost() {
+ return 8;
+ }
+}
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/structural/decorator/v2/EggDecorator.java
new file mode 100644
index 0000000..b1fe583
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/EggDecorator.java
@@ -0,0 +1,18 @@
+package com.baiye.design.structural.decorator.v2;
+
+public class EggDecorator extends AbstractDecorator{
+
+ public EggDecorator(ABattercake aBattercake) {
+ super(aBattercake);
+ }
+
+ @Override
+ protected String getDesc() {
+ return super.getDesc() + "加一个鸡蛋";
+ }
+
+ @Override
+ protected int cost() {
+ return super.cost() + 1;
+ }
+}
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/structural/decorator/v2/SausageDecorator.java
new file mode 100644
index 0000000..942fbc2
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/SausageDecorator.java
@@ -0,0 +1,17 @@
+package com.baiye.design.structural.decorator.v2;
+
+public class SausageDecorator extends AbstractDecorator{
+ public SausageDecorator(ABattercake aBattercake) {
+ super(aBattercake);
+ }
+
+ @Override
+ protected String getDesc() {
+ return super.getDesc() + "加一个香肠";
+ }
+
+ @Override
+ protected int cost() {
+ return super.cost() + 2;
+ }
+}
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/structural/decorator/v2/Test.java
new file mode 100644
index 0000000..96bbdf3
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/decorator/v2/Test.java
@@ -0,0 +1,11 @@
+package com.baiye.design.structural.decorator.v2;
+
+public class Test {
+ public static void main(String[] args) {
+ ABattercake aBattercake = new Battercake();
+ aBattercake = new EggDecorator(aBattercake);
+ aBattercake = new EggDecorator(aBattercake);
+ aBattercake = new SausageDecorator(aBattercake);
+ System.out.println(aBattercake.getDesc() + "售价为:" + aBattercake.cost());
+ }
+}
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
new file mode 100644
index 0000000..53799d3
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Employee.java
@@ -0,0 +1,5 @@
+package com.baiye.design.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/structural/flyweight/EmployeeFactory.java
new file mode 100644
index 0000000..c5447ac
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/EmployeeFactory.java
@@ -0,0 +1,23 @@
+package com.baiye.design.structural.flyweight;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class EmployeeFactory extends Test {
+ public static final Map EMPLOYEE_MAP = new HashMap<>();
+
+ public static Employee getManager(String department){
+ Manager manager = (Manager) EMPLOYEE_MAP.get(department);
+
+ if (manager == null){
+ manager = new Manager(department);
+ System.out.println("创建部门经理: " + department);
+ String reportContent = department + "部门汇报,此次报告的主要内容是 ....";
+ manager.setReportContent(reportContent);
+ System.out.println(" 创建报告" + reportContent);
+ EMPLOYEE_MAP.put(department, manager);
+
+ }
+ return manager;
+ }
+}
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/structural/flyweight/Manager.java
new file mode 100644
index 0000000..f80311e
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Manager.java
@@ -0,0 +1,22 @@
+package com.baiye.design.structural.flyweight;
+
+public class Manager implements Employee{
+ @Override
+ public void reprot() {
+ System.out.println(reportContent);
+ }
+ // 内部状态
+ private String title;
+
+ // 外部状态
+ private String department;
+ private String reportContent;
+
+ public Manager(String department) {
+ this.department = department;
+ }
+
+ public void setReportContent(String reportContent) {
+ this.reportContent = reportContent;
+ }
+}
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/structural/flyweight/Test.java
new file mode 100644
index 0000000..b94fd30
--- /dev/null
+++ b/dev-protocol-design-pattern/src/main/java/com/baiye/design/structural/flyweight/Test.java
@@ -0,0 +1,25 @@
+package com.baiye.design.structural.flyweight;
+
+public class Test {
+
+ public static final String departments[] = {"RD", "QA", "PM", "BD"};
+
+ public static void main(String[] args) {
+ for (int i = 0; i < 10; i++) {
+ // 随机获取部门的名称
+ String department = departments[(int) (Math.random() * departments.length)];
+ Manager manager = (Manager) EmployeeFactory.getManager(department);
+ manager.reprot();
+ }
+
+ // 享元模式的源码级别应用 - 这里有缓存的
+ Integer a = Integer.valueOf(100);
+ Integer b = 100;
+
+ Integer c = Integer.valueOf(1000);
+ Integer d = 1000;
+
+ System.out.println("a==b: " + (a == b));
+ System.out.println("c==d: " + (c == d));
+ }
+}
diff --git a/pom.xml b/pom.xml
index 62a3ecb..a5df16b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,6 +21,7 @@
jpa/dev-protocol-jpa-auditing2
jpa/dev-protocol-jpa-auditing3
jpa/dev-protocol-jpa-entity-callback
+ dev-protocol-design-pattern