diff --git a/cloud-demos/pom.xml b/cloud-demos/pom.xml
index 37d2033ebb809e8a979fdb4087f6e506f33d0ef9..372b230ad1266344b71ea1d2fba2da99dec15e69 100644
--- a/cloud-demos/pom.xml
+++ b/cloud-demos/pom.xml
@@ -18,6 +18,7 @@
auth-center
common-center
apigateway-center
+ sentinel-sample
diff --git a/cloud-demos/sentinel-sample/pom.xml b/cloud-demos/sentinel-sample/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e6b5ef4c600cf8f611996f5157abeed0507a6b3a
--- /dev/null
+++ b/cloud-demos/sentinel-sample/pom.xml
@@ -0,0 +1,50 @@
+
+
+
+ cloud-demos
+ com.gsean.demos
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ sentinel-sample
+
+
+ 8
+ 8
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-sentinel
+
+
+
+ com.github.xiaoymin
+ knife4j-spring-boot-starter
+ 2.0.7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/SentinelApp.java b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/SentinelApp.java
new file mode 100644
index 0000000000000000000000000000000000000000..2176267b96a04f15770c1424101e128164d96ea3
--- /dev/null
+++ b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/SentinelApp.java
@@ -0,0 +1,19 @@
+package com.gsean.sentinel;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/11/30 14:08
+ * @modificed by
+ **/
+@SpringBootApplication
+public class SentinelApp {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SentinelApp.class,args);
+ }
+
+}
diff --git a/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/config/CustomBlockExceptionHandler.java b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/config/CustomBlockExceptionHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee828723a780716a7981114c45e06d5ebcb2d531
--- /dev/null
+++ b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/config/CustomBlockExceptionHandler.java
@@ -0,0 +1,23 @@
+package com.gsean.sentinel.config;
+
+import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
+import com.alibaba.csp.sentinel.slots.block.BlockException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.stereotype.Component;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/11/30 15:56
+ * @modificed by
+ **/
+@Component
+public class CustomBlockExceptionHandler implements BlockExceptionHandler {
+
+ @Override
+ public void handle(HttpServletRequest httpServletRequest,
+ HttpServletResponse httpServletResponse, BlockException e) throws Exception {
+ throw e;
+ }
+}
diff --git a/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/config/GlobalExceptionHandler.java b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/config/GlobalExceptionHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..883f5aaf02e505a1eed2b6bd6699516227509e72
--- /dev/null
+++ b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/config/GlobalExceptionHandler.java
@@ -0,0 +1,31 @@
+package com.gsean.sentinel.config;
+
+import com.alibaba.csp.sentinel.slots.block.BlockException;
+import com.alibaba.fastjson.JSONObject;
+import com.gsean.sentinel.vo.BizResult;
+import com.gsean.sentinel.vo.ErrorCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/11/30 16:11
+ * @modificed by
+ **/
+@Component
+@ControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+
+ @ResponseBody
+ @ExceptionHandler(value = BlockException.class) // 因为这里是示例,所以暂时使用 JSONObject,实际项目最终定义一个 CommonResult。
+ public BizResult blockExceptionHandler(BlockException blockException) {
+ log.warn("限流拦截");
+ return BizResult.error(ErrorCode.LIMITE_ERROR.getCode(),"请求被拦截,拦截类型为"+blockException.getClass().getSimpleName());
+ }
+}
diff --git a/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/config/SwaggerConfig.java b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/config/SwaggerConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..59aadfb42dc173ce4e6603e19af7f72f208cbbb8
--- /dev/null
+++ b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/config/SwaggerConfig.java
@@ -0,0 +1,42 @@
+package com.gsean.sentinel.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
+
+/**
+ * ProjectName:gsean-springboot-demos
+ * ClassName:SwaggerConfig
+ * Description:TODO
+ * Date:2021/6/29 10:55
+ * Author:GSean
+ * Version: 1.0
+ */
+@Configuration
+@EnableSwagger2WebMvc
+public class SwaggerConfig {
+ @Bean(value = "defaultApi2")
+ public Docket defaultApi2() {
+ Docket docket=new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(new ApiInfoBuilder()
+ //.title("swagger-bootstrap-ui-demo RESTful APIs")
+ .description("# swagger-bootstrap-ui-demo RESTful APIs")
+ .termsOfServiceUrl("http://www.xx.com/")
+ .contact("xx@qq.com")
+ .version("1.0")
+ .build())
+ //分组名称
+ .groupName("2.X版本")
+ .select()
+ //这里指定Controller扫描包路径
+ .apis(RequestHandlerSelectors.basePackage("com.gsean.sentinel.controller"))
+ .paths(PathSelectors.any())
+ .build();
+ return docket;
+ }
+}
diff --git a/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/controller/HelloController.java b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/controller/HelloController.java
new file mode 100644
index 0000000000000000000000000000000000000000..948464c547863c01b9c0b02ae977ef84929b3771
--- /dev/null
+++ b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/controller/HelloController.java
@@ -0,0 +1,25 @@
+package com.gsean.sentinel.controller;
+
+import com.gsean.sentinel.vo.BizResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/11/30 14:13
+ * @modificed by
+ **/
+@RestController
+@Slf4j
+public class HelloController {
+
+
+ @GetMapping("/hello")
+ public BizResult hello(){
+ log.info("请求进来了");
+ return BizResult.success("success");
+ }
+
+}
diff --git a/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/vo/BizResult.java b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/vo/BizResult.java
new file mode 100644
index 0000000000000000000000000000000000000000..b950a7870ac3ffad246c685fc812a6fdd76f11c4
--- /dev/null
+++ b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/vo/BizResult.java
@@ -0,0 +1,100 @@
+package com.gsean.sentinel.vo;
+
+
+import java.io.Serializable;
+
+/**
+ * 统一返回结构
+ *
+ * @auther Chengping.Wang
+ * @date 2021/1/26
+ */
+public class BizResult implements Serializable, IBizError {
+
+ private T result;
+ private String code;
+ private String msg;
+ private boolean success;
+
+ public BizResult() {
+ }
+
+ public BizResult(T result, String code, String msg, Boolean success) {
+ this.result = result;
+ this.code = code;
+ this.msg = msg;
+ this.success = success;
+ }
+
+ public BizResult(IBizError iBizError) {
+ this.code = iBizError.getCode();
+ this.msg = iBizError.getMsg();
+ }
+
+ public BizResult(T result, IBizError iBizError) {
+ this.code = iBizError.getCode();
+ this.msg = iBizError.getMsg();
+ this.result = result;
+ }
+
+ public static BizResult success(T data) {
+ BizResult bizResult = new BizResult<>(ErrorCode.SUCCESS);
+ bizResult.setResult(data);
+ bizResult.setSuccess(true);
+ return bizResult;
+ }
+
+ public static BizResult error(IBizError iBizError) {
+ return new BizResult<>(iBizError);
+ }
+
+ public static BizResult error() {
+ return new BizResult(null, ErrorCode.FAIL.getCode(), null, false);
+ }
+
+ public static BizResult error(String code, String msg) {
+ return new BizResult<>(null, code, msg, false);
+ }
+
+ public static BizResult error(T result, IBizError iBizError) {
+ return new BizResult<>(result, iBizError);
+ }
+
+ public static BizResult error(T result, String code, String msg) {
+ return new BizResult<>(result, code, msg, false);
+ }
+
+ public T getResult() {
+ return result;
+ }
+
+ public void setResult(T result) {
+ this.result = result;
+ }
+
+ @Override
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ @Override
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+
+ public Boolean getSuccess() {
+ return success;
+ }
+
+ public void setSuccess(Boolean success) {
+ this.success = success;
+ }
+}
diff --git a/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/vo/ErrorCode.java b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/vo/ErrorCode.java
new file mode 100644
index 0000000000000000000000000000000000000000..6c5d35fea20c9aad0d67742188ba4d551e637726
--- /dev/null
+++ b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/vo/ErrorCode.java
@@ -0,0 +1,35 @@
+package com.gsean.sentinel.vo;
+
+/**
+ * 系统异常错误码
+ * 其他自定义异常错误码参考
+ *
+ * @auther Chengping.Wang
+ * @date 2021/2/1
+ */
+public enum ErrorCode implements IBizError {
+ /***/
+ SUCCESS("0000", "success"),
+ SYSTEM_ERROR("0001", "system error"),
+ FAIL("0002", "fail"),
+ LIMITE_ERROR("0003", "限流了,稍后再访问吧"),
+ ;
+
+ ErrorCode(String code, String msg) {
+ this.code = code;
+ this.msg = msg;
+ }
+
+ private String code;
+ private String msg;
+
+ @Override
+ public String getCode() {
+ return this.code;
+ }
+
+ @Override
+ public String getMsg() {
+ return this.msg;
+ }
+}
diff --git a/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/vo/IBizError.java b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/vo/IBizError.java
new file mode 100644
index 0000000000000000000000000000000000000000..5dfdeed3fb97eede8a07e706a2fa4a4594ba3ba5
--- /dev/null
+++ b/cloud-demos/sentinel-sample/src/main/java/com/gsean/sentinel/vo/IBizError.java
@@ -0,0 +1,6 @@
+package com.gsean.sentinel.vo;
+
+public interface IBizError {
+ String getCode();
+ String getMsg();
+}
diff --git a/cloud-demos/sentinel-sample/src/main/resources/application.yml b/cloud-demos/sentinel-sample/src/main/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9d3ae658b637445deb4f87cbb0aa7b74901f3047
--- /dev/null
+++ b/cloud-demos/sentinel-sample/src/main/resources/application.yml
@@ -0,0 +1,13 @@
+spring:
+ application:
+ name: demo-provider
+
+ cloud:
+ # Sentinel 配置项,对应 SentinelProperties 配置属性类
+ sentinel:
+ enabled: true # 是否开启。默认为 true 开启
+ eager: true # 是否饥饿加载。默认为 false 关闭
+ transport:
+ dashboard: 127.0.0.1:8858 # Sentinel 控制台地址
+ filter:
+ url-patterns: /** # 拦截请求的地址。默认为 /*
\ No newline at end of file
diff --git a/design-demos/creational-pattern-demos/Sumary.md b/design-demos/creational-pattern-demos/Sumary.md
new file mode 100644
index 0000000000000000000000000000000000000000..df8703f30f0bdd4a0d005d31a10744d19a3d3d78
--- /dev/null
+++ b/design-demos/creational-pattern-demos/Sumary.md
@@ -0,0 +1,4 @@
+## 章节介绍
+
+item01 结构型
+ - item011 建造者模式
\ No newline at end of file
diff --git a/design-demos/creational-pattern-demos/pom.xml b/design-demos/creational-pattern-demos/pom.xml
index 2f4fd38a7ee0d74eaf564e7b68f0c13e0aa47ff5..a73ee6ba4e6a919d17ada42e759c532cfa1f8cfa 100644
--- a/design-demos/creational-pattern-demos/pom.xml
+++ b/design-demos/creational-pattern-demos/pom.xml
@@ -16,4 +16,16 @@
8
+
+
+
+ com.google.guava
+ guava
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+
\ No newline at end of file
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/ApartmentBuilder.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/ApartmentBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..1d6986186a264740051b6572264e0d54b3facd59
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/ApartmentBuilder.java
@@ -0,0 +1,49 @@
+package com.gsean.design.item01.item011;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 12:26
+ * @modificed by
+ **/
+public class ApartmentBuilder implements Builder {
+
+ private Building builing;
+
+
+ public ApartmentBuilder() {
+ this.builing = new Building();
+ }
+
+ @Override
+ public Builder buildBasement() {
+ System.out.println("构建地基,经过一番繁琐的操作后。。。。");
+ builing.setBasement("公寓地基");
+ return this;
+ }
+
+ @Override
+ public Builder buildWall() {
+ System.out.println("构建墙体,经过一番繁琐的操作后。。。。");
+ builing.setWall("公寓墙体");
+ return this;
+ }
+
+ @Override
+ public Builder buildRoof() {
+ System.out.println("构建屋顶,经过一番繁琐的操作后。。。。");
+ builing.setRoof("公寓屋顶");
+ return this;
+ }
+
+ @Override
+ public Builder buildOther() {
+ System.out.println("构建其他东西,经过一番繁琐的操作后。。。。");
+ return this;
+ }
+
+ @Override
+ public Building getBuilding() {
+ return builing;
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/Builder.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/Builder.java
new file mode 100644
index 0000000000000000000000000000000000000000..defbf96f140dccf0e6ccb6de994b3e6ad287c285
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/Builder.java
@@ -0,0 +1,66 @@
+package com.gsean.design.item01.item011;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 11:40
+ * @modificed by
+ **/
+public interface Builder {
+ /**
+ * 建造地基
+ *
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 11:41
+ * @return: com.gsean.design.item01.item011.Builder
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ Builder buildBasement();
+
+ /**
+ * 建造墙体
+ *
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 11:41
+ * @return: com.gsean.design.item01.item011.Builder
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ Builder buildWall();
+
+
+ /**
+ * 建造屋顶
+ *
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 11:41
+ * @return: com.gsean.design.item01.item011.Builder
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ Builder buildRoof();
+
+ /**
+ * 构建其他东西
+ *
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 12:51
+ * @return: com.gsean.design.item01.item011.Builder
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ Builder buildOther();
+
+ /**
+ * 获取建筑
+ *
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 12:27
+ * @return: com.gsean.design.item01.item011.Builing
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ Building getBuilding();
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/Building.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/Building.java
new file mode 100644
index 0000000000000000000000000000000000000000..0649785951eb289aa8f362eabf00cfed8e3b9d87
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/Building.java
@@ -0,0 +1,20 @@
+package com.gsean.design.item01.item011;
+
+import lombok.Data;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 11:37
+ * @modificed by
+ **/
+@Data
+public class Building {
+ // 地基
+ private String basement;
+ // 墙体
+ private String wall;
+ // 屋顶
+ private String roof;
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/Client.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..6521d6ddc8c172a55b9805799281f077201fcd44
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/Client.java
@@ -0,0 +1,21 @@
+package com.gsean.design.item01.item011;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 12:52
+ * @modificed by
+ **/
+public class Client {
+
+ public static void main(String[] args) {
+ Director director = new Director(new VillaBuilder());
+ Building villabuilding = director.direct();
+ System.out.println(villabuilding);
+ }
+
+
+
+
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/Director.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/Director.java
new file mode 100644
index 0000000000000000000000000000000000000000..f060c72402cd24d5ac39355a7982dc71e244d98f
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/Director.java
@@ -0,0 +1,28 @@
+package com.gsean.design.item01.item011;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 12:47
+ * @modificed by
+ **/
+public class Director {
+
+ private Builder builder;
+
+
+ public Director(Builder builder) {
+ this.builder = builder;
+ }
+
+ public Building direct(){
+ // todo 构建地基
+ builder.buildBasement();
+ // todo 构建墙体
+ builder.buildWall();
+ // todo 构建房顶
+ builder.buildRoof();
+ // todo 交付建筑
+ return builder.getBuilding();
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/VillaBuilder.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/VillaBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..748f863ec0895e60246b2f00cc4cc653876b97b9
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item01/item011/VillaBuilder.java
@@ -0,0 +1,49 @@
+package com.gsean.design.item01.item011;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 12:26
+ * @modificed by
+ **/
+public class VillaBuilder implements Builder {
+
+ private Building builing;
+
+
+ public VillaBuilder() {
+ this.builing = new Building();
+ }
+
+ @Override
+ public Builder buildBasement() {
+ System.out.println("构建地基,经过一番繁琐的操作后。。。。");
+ builing.setBasement("别墅地基");
+ return this;
+ }
+
+ @Override
+ public Builder buildWall() {
+ System.out.println("构建墙体,经过一番繁琐的操作后。。。。");
+ builing.setWall("别墅墙体");
+ return this;
+ }
+
+ @Override
+ public Builder buildRoof() {
+ System.out.println("构建屋顶,经过一番繁琐的操作后。。。。");
+ builing.setRoof("别墅屋顶");
+ return this;
+ }
+
+ @Override
+ public Builder buildOther() {
+ System.out.println("构建其他东西,经过一番繁琐的操作后。。。。");
+ return this;
+ }
+
+ @Override
+ public Building getBuilding() {
+ return builing;
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/Client.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..92d9201b5389b3c836e98102e62662c9706fd07c
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/Client.java
@@ -0,0 +1,16 @@
+package com.gsean.design.item02.item021;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 13:48
+ * @modificed by
+ **/
+public class Client {
+
+ public static void main(String[] args) {
+ RestaurantFacade restaurantFacade = new RestaurantFacade();
+ restaurantFacade.order();
+ }
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/CookerProvider.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/CookerProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..76dcbf0f06c4c2933092927b850e8abfa67314d7
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/CookerProvider.java
@@ -0,0 +1,23 @@
+package com.gsean.design.item02.item021;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 13:27
+ * @modificed by
+ **/
+public class CookerProvider {
+ /**
+ * 提供厨师
+ *
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 13:27
+ * @return: void
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ public void provideCooker(){
+ System.out.println("厨师做菜");
+ }
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/FoodProvider.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/FoodProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..4090dacf7f9f493766b6b5c06737c5aa7cf0b014
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/FoodProvider.java
@@ -0,0 +1,23 @@
+package com.gsean.design.item02.item021;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 13:27
+ * @modificed by
+ **/
+public class FoodProvider {
+ /**
+ * 提供食材
+ *
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 13:27
+ * @return: void
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ public void provideFood(){
+ System.out.println("提供食材");
+ }
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/RestaurantFacade.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/RestaurantFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..4bf53e9b4bf0acdde306ee48bffa91f83c9b6cef
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/RestaurantFacade.java
@@ -0,0 +1,28 @@
+package com.gsean.design.item02.item021;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description 饭馆门面
+ * @date:created in 2021/12/1 13:30
+ * @modificed by
+ **/
+public class RestaurantFacade {
+
+ private FoodProvider foodProvider;
+ private WaiterProvider waiterProvider;
+ private CookerProvider cookerProvider;
+
+ public RestaurantFacade() {
+ this.foodProvider = new FoodProvider();
+ this.waiterProvider=new WaiterProvider();
+ this.cookerProvider=new CookerProvider();
+ }
+
+ void order(){
+ foodProvider.provideFood();
+ waiterProvider.provideWaiter();
+ cookerProvider.provideCooker();
+ }
+
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/WaiterProvider.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/WaiterProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..293459e211f15c817220f941b8f186d9b9768a57
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item021/WaiterProvider.java
@@ -0,0 +1,23 @@
+package com.gsean.design.item02.item021;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 13:27
+ * @modificed by
+ **/
+public class WaiterProvider {
+ /**
+ * 提供服务员
+ *
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 13:27
+ * @return: void
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ public void provideWaiter(){
+ System.out.println("服务员招待顾客点餐");
+ }
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/Client.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..3383905ac46294dcf9ca6c7934d4df0004ce319b
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/Client.java
@@ -0,0 +1,16 @@
+package com.gsean.design.item02.item022;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 14:33
+ * @modificed by
+ **/
+public class Client {
+
+
+ public static void main(String[] args) {
+ Girl girl = new Girl("小红");
+ new ConcreteDecoratorA(new ConcreteDecoratorB(girl)).show();
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/ConcreteDecoratorA.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/ConcreteDecoratorA.java
new file mode 100644
index 0000000000000000000000000000000000000000..f726ba030355b926d4e2b28a13e567e9398c7871
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/ConcreteDecoratorA.java
@@ -0,0 +1,27 @@
+package com.gsean.design.item02.item022;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 14:29
+ * @modificed by
+ **/
+public class ConcreteDecoratorA extends Decorator{
+
+ public ConcreteDecoratorA(Showable showable) {
+ super(showable);
+ }
+
+ @Override
+ public void show() {
+ System.out.print("[");
+ enhanceA();
+ super.showable.show();
+ System.out.print("]");
+
+ }
+
+ private void enhanceA(){
+ System.out.print("我是粉底,现在开始画粉底");
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/ConcreteDecoratorB.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/ConcreteDecoratorB.java
new file mode 100644
index 0000000000000000000000000000000000000000..ea1896adae353a499833567640e1aa91cd87a568
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/ConcreteDecoratorB.java
@@ -0,0 +1,27 @@
+package com.gsean.design.item02.item022;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 14:29
+ * @modificed by
+ **/
+public class ConcreteDecoratorB extends Decorator{
+
+ public ConcreteDecoratorB(Showable showable) {
+ super(showable);
+ }
+
+ @Override
+ public void show() {
+ System.out.print("[");
+ enhanceB();
+ super.showable.show();
+ System.out.print("]");
+
+ }
+
+ private void enhanceB(){
+ System.out.print("我是口红,现在涂口红");
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/Decorator.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/Decorator.java
new file mode 100644
index 0000000000000000000000000000000000000000..443031ffefc23302b7080ee6bda5476edf9411c4
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/Decorator.java
@@ -0,0 +1,17 @@
+package com.gsean.design.item02.item022;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 14:26
+ * @modificed by
+ **/
+public abstract class Decorator implements Showable {
+
+ protected Showable showable;
+
+
+ public Decorator(Showable showable) {
+ this.showable=showable;
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/Girl.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/Girl.java
new file mode 100644
index 0000000000000000000000000000000000000000..21d8742d6e71ae1e287ce649faf43027e2ebf655
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/Girl.java
@@ -0,0 +1,21 @@
+package com.gsean.design.item02.item022;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 14:26
+ * @modificed by
+ **/
+public class Girl implements Showable{
+
+ private String name;
+
+ public Girl(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public void show() {
+ System.out.print("[我是"+name+",现在是素颜]");
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/Showable.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/Showable.java
new file mode 100644
index 0000000000000000000000000000000000000000..9db0aea53f9bd1478a28dafa5c1b599fd04251b8
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item022/Showable.java
@@ -0,0 +1,22 @@
+package com.gsean.design.item02.item022;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 14:25
+ * @modificed by
+ **/
+public interface Showable {
+
+ /**
+ * 装饰方法
+ *
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 14:25
+ * @return: void
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ void show();
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/Client.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..547620b1c0e6e114543d02b98ac4a1819cb0c16e
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/Client.java
@@ -0,0 +1,16 @@
+package com.gsean.design.item02.item024.item0241;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 17:10
+ * @modificed by
+ **/
+public class Client {
+
+ public static void main(String[] args) {
+ RouterProxy routerProxy = new RouterProxy(new Modern());
+ routerProxy.accessInternet("http://www.baidu.com");
+ }
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/Internet.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/Internet.java
new file mode 100644
index 0000000000000000000000000000000000000000..975a7ca06546836802466462c8168b6c3a5330de
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/Internet.java
@@ -0,0 +1,23 @@
+package com.gsean.design.item02.item024.item0241;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description 被代理对象
+ * @date:created in 2021/12/1 17:05
+ * @modificed by
+ **/
+public interface Internet {
+
+ /**
+ * 访问互联网
+ *
+ * @param url
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 17:06
+ * @return: void
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ void accessInternet(String url);
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/Modern.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/Modern.java
new file mode 100644
index 0000000000000000000000000000000000000000..1efc26ed1eaecb7e22b983edc97564bb5974d7d6
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/Modern.java
@@ -0,0 +1,15 @@
+package com.gsean.design.item02.item024.item0241;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description 猫(调制解调器)
+ * @date:created in 2021/12/1 17:07
+ * @modificed by
+ **/
+public class Modern implements Internet{
+
+ @Override
+ public void accessInternet(String url) {
+ System.out.println("开始通过modern访问互联网,访问地址:"+url);
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/RouterProxy.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/RouterProxy.java
new file mode 100644
index 0000000000000000000000000000000000000000..092616cc90db4caf9e0c4c350ffa03bcc5116e00
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/RouterProxy.java
@@ -0,0 +1,37 @@
+package com.gsean.design.item02.item024.item0241;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description 路由代理 静态代理
+ * @date:created in 2021/12/1 17:08
+ * @modificed by
+ **/
+public class RouterProxy implements Internet{
+
+ private Internet internet;
+
+ public RouterProxy(Internet internet) {
+ this.internet = internet;
+ }
+
+
+ @Override
+ public void accessInternet(String url) {
+ whiteFilter();
+ internet.accessInternet(url);
+ }
+
+ /**
+ *
+ * 白名单过滤
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 17:19
+ * @return: boolean
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ private boolean whiteFilter(){
+ System.out.println("代理增强操作:白名单过滤");
+ return true;
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/RouterProxy2.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/RouterProxy2.java
new file mode 100644
index 0000000000000000000000000000000000000000..127d466eebe6cc35c0e9a32690a02a8fb117f0df
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0241/RouterProxy2.java
@@ -0,0 +1,37 @@
+package com.gsean.design.item02.item024.item0241;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description 路由代理 静态代理
+ * @date:created in 2021/12/1 17:08
+ * @modificed by
+ **/
+public class RouterProxy2 implements Internet{
+
+ private Internet internet;
+
+ public RouterProxy2(Internet internet) {
+ this.internet = internet;
+ }
+
+
+ @Override
+ public void accessInternet(String url) {
+ whiteFilter();
+ internet.accessInternet(url);
+ }
+
+ /**
+ *
+ * 白名单过滤
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 17:19
+ * @return: boolean
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ private boolean whiteFilter(){
+ System.out.println("代理增强操作:白名单过滤");
+ return true;
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/Client.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9e614eac7199de19bd40aead4dacc7c548a2cb8
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/Client.java
@@ -0,0 +1,20 @@
+package com.gsean.design.item02.item024.item0242;
+
+import java.lang.reflect.Proxy;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 17:10
+ * @modificed by
+ **/
+public class Client {
+
+ public static void main(String[] args) {
+ Internet internet = (Internet) Proxy
+ .newProxyInstance(RouterProxy.class.getClassLoader(), RouterProxy.class.getInterfaces(),
+ new WhiteFilter(new RouterProxy(new Modern())));
+ internet.accessInternet("http://www.google.com");
+ }
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/Internet.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/Internet.java
new file mode 100644
index 0000000000000000000000000000000000000000..91ba2dc57e8f64b62bc9d82cfa60af10d4a4dd98
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/Internet.java
@@ -0,0 +1,23 @@
+package com.gsean.design.item02.item024.item0242;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description 被代理对象
+ * @date:created in 2021/12/1 17:05
+ * @modificed by
+ **/
+public interface Internet {
+
+ /**
+ * 访问互联网
+ *
+ * @param url
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 17:06
+ * @return: void
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ void accessInternet(String url);
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/Modern.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/Modern.java
new file mode 100644
index 0000000000000000000000000000000000000000..545a05940e2385f221b40339bd4bde51170c9561
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/Modern.java
@@ -0,0 +1,15 @@
+package com.gsean.design.item02.item024.item0242;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description 猫(调制解调器)
+ * @date:created in 2021/12/1 17:07
+ * @modificed by
+ **/
+public class Modern implements Internet {
+
+ @Override
+ public void accessInternet(String url) {
+ System.out.println("开始通过modern访问互联网,访问地址:"+url);
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/RouterProxy.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/RouterProxy.java
new file mode 100644
index 0000000000000000000000000000000000000000..148b262803dce0144e65c6e0f756fe643dd739d7
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/RouterProxy.java
@@ -0,0 +1,24 @@
+package com.gsean.design.item02.item024.item0242;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description 路由代理 静态代理
+ * @date:created in 2021/12/1 17:08
+ * @modificed by
+ **/
+public class RouterProxy implements Internet {
+
+ private Internet internet;
+
+ public RouterProxy(Internet internet) {
+ this.internet = internet;
+ }
+
+
+ @Override
+ public void accessInternet(String url) {
+ internet.accessInternet(url);
+ }
+
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/RouterProxy2.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/RouterProxy2.java
new file mode 100644
index 0000000000000000000000000000000000000000..0d7eb938af32920e529db897944117901cd0fec0
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/RouterProxy2.java
@@ -0,0 +1,24 @@
+package com.gsean.design.item02.item024.item0242;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description 路由代理 静态代理
+ * @date:created in 2021/12/1 17:08
+ * @modificed by
+ **/
+public class RouterProxy2 implements Internet {
+
+ private Internet internet;
+
+ public RouterProxy2(Internet internet) {
+ this.internet = internet;
+ }
+
+
+ @Override
+ public void accessInternet(String url) {
+ internet.accessInternet(url);
+ }
+
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/WhiteFilter.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/WhiteFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca9383d1220dcddac1a2ada37bf607d98e375a32
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item024/item0242/WhiteFilter.java
@@ -0,0 +1,46 @@
+package com.gsean.design.item02.item024.item0242;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 17:22
+ * @modificed by
+ **/
+public class WhiteFilter implements InvocationHandler {
+
+ private Object object;
+
+ public WhiteFilter(Object object) {
+ this.object = object;
+ System.out.println("开启白名单功能");
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ // 切入方法统一操作
+ String arg = args[0].toString();
+ System.out.println("开始进入统一代理切入功能");
+ if(!whiteFilter(arg)){
+ throw new RuntimeException("非白名单,禁止访问");
+ }
+ return method.invoke(object,args);
+ }
+
+
+ /**
+ *
+ * 白名单过滤
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 17:19
+ * @return: boolean
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ private boolean whiteFilter(String url){
+ System.out.println("代理增强操作:白名单过滤");
+ return !url.contains("google");
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/BlackPen.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/BlackPen.java
new file mode 100644
index 0000000000000000000000000000000000000000..c618f7349903d9f1ca167b64810fa2dd137324fd
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/BlackPen.java
@@ -0,0 +1,20 @@
+package com.gsean.design.item02.item025;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 18:13
+ * @modificed by
+ **/
+public class BlackPen extends Pen{
+
+ public BlackPen(Ruler ruler) {
+ super(ruler);
+ }
+
+ @Override
+ void draw() {
+ System.out.print("黑");
+ ruler.regularize();
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/Client.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..80a9db97f7637329bf8a92153aead9e2f97ffae3
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/Client.java
@@ -0,0 +1,21 @@
+package com.gsean.design.item02.item025;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 18:18
+ * @modificed by
+ **/
+public class Client {
+
+ public static void main(String[] args) {
+ //黑笔正方形尺子
+ BlackPen blackPen = new BlackPen(new SquareRuler());
+ blackPen.draw();
+ System.out.println();
+ //白笔三角形尺子
+ WhitePen whitePen = new WhitePen(new TriangRuler());
+ whitePen.draw();
+ }
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/Pen.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/Pen.java
new file mode 100644
index 0000000000000000000000000000000000000000..8e8e923c428791eed21c0310315f31777e22e2c5
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/Pen.java
@@ -0,0 +1,18 @@
+package com.gsean.design.item02.item025;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 18:12
+ * @modificed by
+ **/
+public abstract class Pen {
+
+ protected Ruler ruler;
+
+ public Pen(Ruler ruler) {
+ this.ruler = ruler;
+ }
+
+ abstract void draw();
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/Ruler.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/Ruler.java
new file mode 100644
index 0000000000000000000000000000000000000000..5fa7fd68c662dcfa0516b10c626c08c3b5ff9c70
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/Ruler.java
@@ -0,0 +1,21 @@
+package com.gsean.design.item02.item025;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 18:09
+ * @modificed by
+ **/
+public interface Ruler {
+ /**
+ * 尺子产品输出
+ *
+ * @author: Jincheng.Guo11
+ * @date: 2021/12/1 18:09
+ * @return: void
+ * @throws: java.lang.Exception
+ * @modificed by:
+ */
+ void regularize();
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/SquareRuler.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/SquareRuler.java
new file mode 100644
index 0000000000000000000000000000000000000000..ead26ebe43ee681d093852fd8bb677ea757188f6
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/SquareRuler.java
@@ -0,0 +1,15 @@
+package com.gsean.design.item02.item025;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 18:10
+ * @modificed by
+ **/
+public class SquareRuler implements Ruler{
+
+ @Override
+ public void regularize() {
+ System.out.print("□");
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/TriangRuler.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/TriangRuler.java
new file mode 100644
index 0000000000000000000000000000000000000000..b5ca7112955026c3af5216ef8bbf936e782313df
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/TriangRuler.java
@@ -0,0 +1,15 @@
+package com.gsean.design.item02.item025;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 18:10
+ * @modificed by
+ **/
+public class TriangRuler implements Ruler{
+
+ @Override
+ public void regularize() {
+ System.out.print("△");
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/WhitePen.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/WhitePen.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f4a6d4b498ba48ffd3caee62b1f453fbf228bcb
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item025/WhitePen.java
@@ -0,0 +1,20 @@
+package com.gsean.design.item02.item025;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/1 18:13
+ * @modificed by
+ **/
+public class WhitePen extends Pen{
+
+ public WhitePen(Ruler ruler) {
+ super(ruler);
+ }
+
+ @Override
+ void draw() {
+ System.out.print("白");
+ ruler.regularize();
+ }
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0261/Client.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0261/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..32d6ea494f610ff5d8f59fb1e323e695e495cc96
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0261/Client.java
@@ -0,0 +1,37 @@
+package com.gsean.design.item02.item026.item0261;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/2 10:20
+ * @modificed by
+ **/
+public class Client {
+
+ public static void main(String[] args) {
+ Folder root = new Folder("root");
+
+ Folder javaFolder = new Folder("java目录");
+ javaFolder.addChild(new File("java说明文档"));
+ javaFolder.addChild(new File("java入门到精通"));
+ root.addChild(javaFolder);
+
+ Folder pythonFolder = new Folder("python目录");
+ pythonFolder.addChild(new File("python说明文档"));
+ pythonFolder.addChild(new File("python入门到精通"));
+ root.addChild(pythonFolder);
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ try {
+ System.out.println(objectMapper.writeValueAsString(root));
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+
+
+ }
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0261/File.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0261/File.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd1e5cc8f68b5c91ed96ef1439eaeb33a0294b3b
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0261/File.java
@@ -0,0 +1,24 @@
+package com.gsean.design.item02.item026.item0261;
+
+import lombok.Getter;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/2 10:20
+ * @modificed by
+ **/
+@Getter
+public class File extends Node{
+
+ public File(String name) {
+ super(name);
+ }
+
+ @Override
+ void operation() {
+
+ }
+
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0261/Folder.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0261/Folder.java
new file mode 100644
index 0000000000000000000000000000000000000000..1bccc59a31f5db5cd6ae8aee7b80738f4a01670c
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0261/Folder.java
@@ -0,0 +1,38 @@
+package com.gsean.design.item02.item026.item0261;
+
+import java.util.ArrayList;
+import java.util.List;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/2 10:16
+ * @modificed by
+ **/
+@Getter
+@EqualsAndHashCode(callSuper = true)
+public class Folder extends Node{
+ List childrens=new ArrayList<>();
+
+ public Folder(String name) {
+ super(name);
+ }
+
+
+ @Override
+ void operation() {
+
+ }
+
+ @Override
+ protected boolean addChild(Node node) {
+ childrens.add(node);
+ return true;
+ }
+
+
+
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0261/Node.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0261/Node.java
new file mode 100644
index 0000000000000000000000000000000000000000..e7d6f699a15ee0df43c3471a97816990d70cc678
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0261/Node.java
@@ -0,0 +1,30 @@
+package com.gsean.design.item02.item026.item0261;
+
+import lombok.Getter;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/2 10:11
+ * @modificed by
+ **/
+@Getter
+public abstract class Node {
+ protected final String name;
+
+ public Node(String name) {
+ this.name = name;
+ }
+
+ abstract void operation();
+
+ protected boolean addChild(Node node){
+ throw new UnsupportedOperationException("无法添加孩子节点");
+ }
+
+
+
+
+
+
+}
diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/Branch.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/Branch.java
new file mode 100644
index 0000000000000000000000000000000000000000..4028bd2ffa5cdd4c7fc1172bf34a6d123630c426
--- /dev/null
+++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/Branch.java
@@ -0,0 +1,39 @@
+package com.gsean.design.item02.item026.item0262;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * @authoer Jincheng.Guo11
+ * @description
+ * @date:created in 2021/12/2 10:16
+ * @modificed by
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Accessors(chain = true)
+public class Branch extends Menu {
+ List