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 childrens=new ArrayList<>(); + + + + @Override + protected boolean addChild(Menu menu) { + if(Objects.isNull(menu)){ + return false; + } + childrens.add(menu); + return true; + } + + + + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/Client.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/Client.java new file mode 100644 index 0000000000000000000000000000000000000000..d34418bf10b4783c5badb434f25de8f6409208c5 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/Client.java @@ -0,0 +1,87 @@ +package com.gsean.design.item02.item026.item0262; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.nio.channels.MulticastChannel; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/2 10:20 + * @modificed by + **/ +public class Client { + private static List menus=new ArrayList<>(); + private static ObjectMapper objectMapper = new ObjectMapper(); + + static { + MenuNode root = new MenuNode().setId(1).setName("系统管理").setParentId(-1); + try { + MenuNode root1 = (MenuNode)root.clone(); + root1.setName("角色管理").setId(2); + MenuNode root2 = (MenuNode)root.clone(); + root2.setName("部门管理").setId(3); + MenuNode leaf1 = (MenuNode)root.clone(); + leaf1.setName("总经理").setId(4).setParentId(2); + MenuNode leaf2= (MenuNode)root.clone(); + leaf2.setName("董事长").setId(5).setParentId(2); + MenuNode leaf3= (MenuNode)root.clone(); + leaf3.setName("人事部").setId(6).setParentId(3); + MenuNode leaf4= (MenuNode)root.clone(); + leaf4.setName("sub总经理").setId(7).setParentId(4); + menus.addAll(Arrays.asList(root,root1,root2,leaf1,leaf2,leaf3,leaf4)); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + } + + + public static void main(String[] args) throws Exception{ + System.out.println(objectMapper.writeValueAsString(menus)); + // todo 转化实体到dto + MenuNode root1 = new MenuNode().setId(-1).setName("root"); + Menu root=node2dto(root1,menus); + System.out.println(objectMapper.writeValueAsString(root)); + + + + + + } + /** + * 递归转换值 + * + * @param menus + * @author: Jincheng.Guo11 + * @date: 2021/12/2 13:50 + * @return: com.gsean.design.item02.item026.item0262.Menu + * @throws: java.lang.Exception + * @modificed by: + */ + private static Menu node2dto(MenuNode root,List menus) { + // 结束条件:当前节点没有子节点 + if(root.isLeaf(menus)){ + return null; + } + // 递归转换 + // 获取当前节点的所有下层节点 + Menu currentMenu=new Branch().setId(root.getId()).setName(root.getName()); + List childrensByNext = menus.stream() + .filter(item -> item.getParentId().equals(root.getId())) + .collect(Collectors.toList()); + // 循环下层节点并递归转换 + childrensByNext.stream() + .forEachOrdered(item2->{ + Branch branch = new Branch(); + branch.setId(item2.getId()).setName(item2.getName()); + branch.addChild(node2dto(item2,menus)); + currentMenu.addChild(branch); + }); + return currentMenu; + } + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/Leaf.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/Leaf.java new file mode 100644 index 0000000000000000000000000000000000000000..ccb76f6368b44da9518589e42774c50432743763 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/Leaf.java @@ -0,0 +1,25 @@ +package com.gsean.design.item02.item026.item0262; + +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:20 + * @modificed by + **/ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@Accessors(chain = true) +public class Leaf extends Menu { + + + + + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/Menu.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/Menu.java new file mode 100644 index 0000000000000000000000000000000000000000..75a438f825661024bda7c4308d0fb69f08a69802 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/Menu.java @@ -0,0 +1,32 @@ +package com.gsean.design.item02.item026.item0262; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/2 10:11 + * @modificed by + **/ +@Getter +@Setter +@Accessors(chain = true) +public abstract class Menu { + protected Integer id; + protected String name; + + public Menu() { + } + + protected boolean addChild(Menu menu){ + throw new UnsupportedOperationException("无法添加孩子节点"); + } + + + + + + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/MenuNode.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/MenuNode.java new file mode 100644 index 0000000000000000000000000000000000000000..19112a359493228e088c468d2b03f79fe9f7b42a --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item02/item026/item0262/MenuNode.java @@ -0,0 +1,38 @@ +package com.gsean.design.item02.item026.item0262; + +import java.util.List; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/2 13:04 + * @modificed by + **/ +@Data +@Accessors(chain = true) +@NoArgsConstructor +public class MenuNode implements Cloneable{ + + + private Integer id; + private Integer parentId; + private String name; + + + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + // 是否是叶子节点 + public boolean isLeaf(List menus){ + return !isBranch(menus); + } + // 是否是分支 + public boolean isBranch(List menus){ + return menus.stream().anyMatch(item->item.parentId.equals(id)); + } +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/Client.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/Client.java new file mode 100644 index 0000000000000000000000000000000000000000..50cd920ae412c163bb2cf45a7e1258a460cafb7e --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/Client.java @@ -0,0 +1,18 @@ +package com.gsean.design.item03.item031.item0311; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 10:49 + * @modificed by + **/ +public class Client { + + public static void main(String[] args) { + PromotionContext promotionContext = new PromotionContext(); + promotionContext.getPromotionStrategy(PromotionEnum.PROMTIONA).doPromotion(); + promotionContext.getPromotionStrategy(PromotionEnum.PROMTIONB).doPromotion(); + promotionContext.getPromotionStrategy(PromotionEnum.PROMTIONC).doPromotion(); + } + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/ConcretePromotionStrategyA.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/ConcretePromotionStrategyA.java new file mode 100644 index 0000000000000000000000000000000000000000..a729bec622911b857035263c5a1405ee09055c64 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/ConcretePromotionStrategyA.java @@ -0,0 +1,15 @@ +package com.gsean.design.item03.item031.item0311; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 10:47 + * @modificed by + **/ +public class ConcretePromotionStrategyA implements IPromotionStrategy{ + + @Override + public void doPromotion() { + System.out.println("做促销方式A"); + } +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/ConcretePromotionStrategyB.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/ConcretePromotionStrategyB.java new file mode 100644 index 0000000000000000000000000000000000000000..12d6996860ffd7b487d0166c9de627c1914cee3d --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/ConcretePromotionStrategyB.java @@ -0,0 +1,15 @@ +package com.gsean.design.item03.item031.item0311; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 10:47 + * @modificed by + **/ +public class ConcretePromotionStrategyB implements IPromotionStrategy{ + + @Override + public void doPromotion() { + System.out.println("做促销方式B"); + } +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/IPromotionStrategy.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/IPromotionStrategy.java new file mode 100644 index 0000000000000000000000000000000000000000..0fb03fd506874017a9c29bec98135c5e82cad172 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/IPromotionStrategy.java @@ -0,0 +1,21 @@ +package com.gsean.design.item03.item031.item0311; + +/** + * @authoer Jincheng.Guo11 + * @description 促销策略 + * @date:created in 2021/12/3 10:44 + * @modificed by + **/ +public interface IPromotionStrategy { + /** + * 做促销 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/3 10:45 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + void doPromotion(); + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/PromotionContext.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/PromotionContext.java new file mode 100644 index 0000000000000000000000000000000000000000..ec1ad3223450dcc86afec3f72353953b43060563 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/PromotionContext.java @@ -0,0 +1,37 @@ +package com.gsean.design.item03.item031.item0311; + +import com.sun.xml.internal.ws.api.ha.HaInfo; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 10:48 + * @modificed by + **/ +public class PromotionContext { + + + private static Map PROMOTIONS; + + static { + Map temp = new HashMap<>(); + temp.put(PromotionEnum.PROMTIONA,new ConcretePromotionStrategyA()); + temp.put(PromotionEnum.PROMTIONB,new ConcretePromotionStrategyB()); + PROMOTIONS = Collections.unmodifiableMap(temp); + } + + + public IPromotionStrategy getPromotionStrategy(PromotionEnum promotionEnum){ + IPromotionStrategy iPromotionStrategy = PROMOTIONS.get(promotionEnum); + if(Objects.isNull(iPromotionStrategy)){ + throw new RuntimeException("未知策略"); + } + return iPromotionStrategy; + } + + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/PromotionEnum.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/PromotionEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..6db3125198849eaf50222ae51f618185dfe889fb --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item031/item0311/PromotionEnum.java @@ -0,0 +1,28 @@ +package com.gsean.design.item03.item031.item0311; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 11:09 + * @modificed by + **/ +public enum PromotionEnum { + // 促销活动A + PROMTIONA, + // 促销活动B + PROMTIONB, + PROMTIONC; + + + + + + + + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/Approver.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/Approver.java new file mode 100644 index 0000000000000000000000000000000000000000..a2331034f991df40c1a31dbee26b70d39aca1459 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/Approver.java @@ -0,0 +1,33 @@ +package com.gsean.design.item03.item032.item0232; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/2 16:12 + * @modificed by + **/ +public abstract class Approver { + protected String name; + protected Approver nextApprover; //下级审批人 + + protected Approver setNextApprover(Approver nextApprover){ + this.nextApprover=nextApprover; + return this.nextApprover; + } + + public Approver(String name) { + this.name = name; + } + + /** + * 审批操作 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/2 16:14 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + abstract void approve(int amount); + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/Boss.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/Boss.java new file mode 100644 index 0000000000000000000000000000000000000000..3e2143f775df7e313d22586959bacddf7406160c --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/Boss.java @@ -0,0 +1,26 @@ +package com.gsean.design.item03.item032.item0232; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/2 16:15 + * @modificed by + **/ +public class Boss extends Approver{ + + public Boss(String name) { + super(name); + } + + @Override + void approve(int amount) { + // 部门负责人可以审批1000-5000 + if(amount>10000){ + System.out.println(name+"驳回"); + }else{ + System.out.println(name+"审批通过"); + } + } + + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/CEO.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/CEO.java new file mode 100644 index 0000000000000000000000000000000000000000..44a8d71959fc429a02071169b75b6e97b6bb966c --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/CEO.java @@ -0,0 +1,27 @@ +package com.gsean.design.item03.item032.item0232; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/2 16:15 + * @modificed by + **/ +public class CEO extends Approver{ + + public CEO(String name) { + super(name); + } + + @Override + void approve(int amount) { + // 部门负责人可以审批1000-5000 + if(amount>5000){ + System.out.println(name+"无法审批,升级下级专员["+this.nextApprover.name+"]"); + this.nextApprover.approve(amount); + }else{ + System.out.println(name+"审批通过"); + } + } + + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/Client.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/Client.java new file mode 100644 index 0000000000000000000000000000000000000000..87606fb5154279449c0ee77c8bb354648bf92baf --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/Client.java @@ -0,0 +1,18 @@ +package com.gsean.design.item03.item032.item0232; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/2 16:33 + * @modificed by + **/ +public class Client { + + public static void main(String[] args) { + Manager manager = new Manager("部门管理员"); + manager.setNextApprover(new CEO("CEO")).setNextApprover(new Boss("Boss")); + + manager.approve(3000); + } + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/Manager.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/Manager.java new file mode 100644 index 0000000000000000000000000000000000000000..7148fa1cf388ea45a8090f254f2a16099552ea14 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0232/Manager.java @@ -0,0 +1,27 @@ +package com.gsean.design.item03.item032.item0232; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/2 16:15 + * @modificed by + **/ +public class Manager extends Approver{ + + public Manager(String name) { + super(name); + } + + @Override + void approve(int amount) { + // 部门负责人可以审批1000元 + if(amount>1000){ + System.out.println(name+"无法审批,升级下级专员["+this.nextApprover.name+"]"); + this.nextApprover.approve(amount); + }else{ + System.out.println(name+"审批通过"); + } + } + + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/AuthHandler.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/AuthHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..9dae50509766d6b4724b1113d92ff54696a2f4a5 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/AuthHandler.java @@ -0,0 +1,25 @@ +package com.gsean.design.item03.item032.item0321; + +import java.util.Objects; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 14:22 + * @modificed by + **/ +public class AuthHandler extends Handler { + + + public AuthHandler() { + this.name="权限验证器"; + } + + @Override + void handle(RequestDTO requestDTO) { + if(!requestDTO.getRoleName().equals("admin")){ + throw new RuntimeException("无权限操作"); + } + System.out.println(name+"通过"); + } +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/Client.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/Client.java new file mode 100644 index 0000000000000000000000000000000000000000..6f725265e5cd054197b196279ab772aa6b43dc24 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/Client.java @@ -0,0 +1,26 @@ +package com.gsean.design.item03.item032.item0321; + +import com.gsean.design.item03.item032.item0321.Handler.Builder; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 14:31 + * @modificed by + **/ +public class Client { + + public static void main(String[] args) { + LoginHandler loginHandler = new LoginHandler(); + ValidateHandler validateHandler = new ValidateHandler(); + AuthHandler authHandler = new AuthHandler(); + + Builder builder = new Builder(); + Handler handler = builder + .addHandler(validateHandler) + .addHandler(loginHandler) + .addHandler(authHandler).build(); + handler.handle(new RequestDTO("admin",null,"admin")); + } + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/Handler.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/Handler.java new file mode 100644 index 0000000000000000000000000000000000000000..3647e6c2298952bf9d500f469d452e849c76e40a --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/Handler.java @@ -0,0 +1,51 @@ +package com.gsean.design.item03.item032.item0321; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 14:18 + * @modificed by + **/ +public abstract class Handler { + + protected Handler chain; + + protected String name; + + + + public void setNextHandler(Handler nextHanlder) { + this.chain = nextHanlder; + } + /** + * 执行链式擦操作 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/3 14:22 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + abstract void handle(RequestDTO requestDTO); + + + public static class Builder { + private Handler head; + private Handler tail; + + public Builder addHandler(Handler handler){ + if(this.head==null){ + this.head=this.tail=handler; + return this; + } + this.tail.setNextHandler(handler); + this.tail=handler; + return this; + } + + + public Handler build(){ + return this.head; + } + } +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/LoginHandler.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/LoginHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..d8ba417baa4e8162852f26c101e2e9027f47359d --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/LoginHandler.java @@ -0,0 +1,23 @@ +package com.gsean.design.item03.item032.item0321; + +import java.util.Objects; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 14:22 + * @modificed by + **/ +public class LoginHandler extends Handler { + + + public LoginHandler() { + this.name="登录验证器"; + } + + @Override + void handle(RequestDTO requestDTO) { + System.out.println(name+"通过"); + chain.handle(requestDTO); + } +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/RequestDTO.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/RequestDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..dac1d4de1d657f25cd3059ad2eb34e3df94a4e85 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/RequestDTO.java @@ -0,0 +1,20 @@ +package com.gsean.design.item03.item032.item0321; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 14:23 + * @modificed by + **/ +@Data +@AllArgsConstructor +public class RequestDTO { + + private String username; + private String password; + private String roleName; + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/ValidateHandler.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/ValidateHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..5436cfd896efcf173ee57dd0fc3732e2cdf2a0c2 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item032/item0321/ValidateHandler.java @@ -0,0 +1,26 @@ +package com.gsean.design.item03.item032.item0321; + +import java.util.Objects; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 14:22 + * @modificed by + **/ +public class ValidateHandler extends Handler { + + + public ValidateHandler() { + this.name="判空验证器"; + } + + @Override + void handle(RequestDTO requestDTO) { + if(Objects.isNull(requestDTO.getUsername())||Objects.isNull(requestDTO.getPassword())){ + throw new RuntimeException("用户名密码不能为空"); + } + System.out.println(name+"通过"); + chain.handle(requestDTO); + } +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/Client.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/Client.java new file mode 100644 index 0000000000000000000000000000000000000000..f0896edb4fc961a10094d6f8915c25fe641ad876 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/Client.java @@ -0,0 +1,18 @@ +package com.gsean.design.item03.item033.item0331; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 16:20 + * @modificed by + **/ +public class Client { + + + public static void main(String[] args) { + Context context = new Context(); + context.setiState(new ConcreteStateB()); + context.exeHandle(); + } + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/ConcreteStateA.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/ConcreteStateA.java new file mode 100644 index 0000000000000000000000000000000000000000..4184be0ec3c503a584e963f93adb5046ce7f3f33 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/ConcreteStateA.java @@ -0,0 +1,22 @@ +package com.gsean.design.item03.item033.item0331; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 16:12 + * @modificed by + **/ +public class ConcreteStateA extends State { + + + + + + @Override + void handle(Context context) { + System.out.println("状态A执行操作,并自动切换状态B并执行"); + context.setiState(new ConcreteStateB()); + context.exeHandle(); + + } +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/ConcreteStateB.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/ConcreteStateB.java new file mode 100644 index 0000000000000000000000000000000000000000..f4ac31b82d5bbe1f35714d1a48235c6a472dfb36 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/ConcreteStateB.java @@ -0,0 +1,18 @@ +package com.gsean.design.item03.item033.item0331; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 16:12 + * @modificed by + **/ +public class ConcreteStateB extends State { + + + + + @Override + void handle(Context context) { + System.out.println("状态B执行操作"); + } +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/Context.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/Context.java new file mode 100644 index 0000000000000000000000000000000000000000..4bd0f216be212f892606fe89142e4051570e7b7a --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/Context.java @@ -0,0 +1,23 @@ +package com.gsean.design.item03.item033.item0331; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 16:18 + * @modificed by + **/ +public class Context { + + protected State iState; + + + public void setiState(State iState){ + this.iState=iState; + } + + + public void exeHandle(){ + this.iState.handle(this); + } + +} diff --git a/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/State.java b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/State.java new file mode 100644 index 0000000000000000000000000000000000000000..8f78c8bfca7e2af6f01a93e45df31bf2478baf17 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/main/java/com/gsean/design/item03/item033/item0331/State.java @@ -0,0 +1,23 @@ +package com.gsean.design.item03.item033.item0331; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/3 15:59 + * @modificed by + **/ +public abstract class State { + + + /** + * 状态执行操作 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/3 15:59 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + abstract void handle(Context context); + +} diff --git a/design-demos/creational-pattern-demos/src/test/java/com/gsean/design/item01/item011/ClientTest.java b/design-demos/creational-pattern-demos/src/test/java/com/gsean/design/item01/item011/ClientTest.java new file mode 100644 index 0000000000000000000000000000000000000000..fa068b7da8fa3fe5a1f2d8c77136dc2b9cbee6ab --- /dev/null +++ b/design-demos/creational-pattern-demos/src/test/java/com/gsean/design/item01/item011/ClientTest.java @@ -0,0 +1,48 @@ +package com.gsean.design.item01.item011; + +import static org.junit.Assert.*; + +import org.junit.Test; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/1 13:00 + * @modificed by + **/ +public class ClientTest { + /** + * 构建别墅客户测试 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/1 13:00 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + @Test + public void testA(){ + Director director = new Director(new VillaBuilder()); + Building building = director.direct(); + System.out.println(building); + } + + + /** + * 构建公寓客户测试 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/1 13:00 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + @Test + public void testB(){ + Director director = new Director(new ApartmentBuilder()); + Building building = director.direct(); + System.out.println(building); + } + + +} \ No newline at end of file diff --git a/design-demos/creational-pattern-demos/src/test/java/com/gsean/design/item02/item022/ClientTest.java b/design-demos/creational-pattern-demos/src/test/java/com/gsean/design/item02/item022/ClientTest.java new file mode 100644 index 0000000000000000000000000000000000000000..87c6bd54db61c131ce651804f0cd78ee1fe90e97 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/test/java/com/gsean/design/item02/item022/ClientTest.java @@ -0,0 +1,47 @@ +package com.gsean.design.item02.item022; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.springframework.boot.autoconfigure.info.ProjectInfoProperties.Git; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/1 14:41 + * @modificed by + **/ +public class ClientTest { + /** + * 小菊化妆:粉底+口红 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/1 14:42 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + @Test + public void testA(){ + Girl girl = new Girl("小菊"); + new ConcreteDecoratorB(new ConcreteDecoratorA(girl)).show(); + + } + + /** + * 小红化妆:口红 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/1 14:42 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + @Test + public void testB(){ + Girl girl = new Girl("小红"); + new ConcreteDecoratorB(girl).show(); + + } + +} \ No newline at end of file diff --git a/design-demos/creational-pattern-demos/src/test/java/com/gsean/design/item02/item024/item0242/ClientTest.java b/design-demos/creational-pattern-demos/src/test/java/com/gsean/design/item02/item024/item0242/ClientTest.java new file mode 100644 index 0000000000000000000000000000000000000000..bdfe57ba1cfa88145309ee09b6cddf3ed048d5c1 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/test/java/com/gsean/design/item02/item024/item0242/ClientTest.java @@ -0,0 +1,70 @@ +package com.gsean.design.item02.item024.item0242; + +import static org.junit.Assert.*; + +import java.lang.reflect.Proxy; +import org.junit.Test; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/1 17:34 + * @modificed by + **/ +public class ClientTest { + + + /** + * 动态代理白名单通过 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/1 17:34 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + @Test + public void testA(){ + Internet internet = (Internet) Proxy + .newProxyInstance(RouterProxy.class.getClassLoader(), RouterProxy.class.getInterfaces(), + new WhiteFilter(new RouterProxy(new Modern()))); + internet.accessInternet("http://www.baidu.com"); + } + + + /** + * 动态代理白名单不通过 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/1 17:34 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + @Test + public void testB(){ + Internet internet = (Internet) Proxy + .newProxyInstance(RouterProxy.class.getClassLoader(), RouterProxy.class.getInterfaces(), + new WhiteFilter(new RouterProxy(new Modern()))); + internet.accessInternet("http://www.google.com"); + } + + + /** + * 其他代理也能使用公共方法 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/1 17:34 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + @Test + public void testC(){ + Internet internet = (Internet) Proxy + .newProxyInstance(RouterProxy2.class.getClassLoader(), RouterProxy2.class.getInterfaces(), + new WhiteFilter(new RouterProxy2(new Modern()))); + internet.accessInternet("http://www.baidu.com"); + } + +} \ No newline at end of file diff --git a/design-demos/creational-pattern-demos/src/test/java/com/gsean/design/item03/item032/item0232/ClientTest.java b/design-demos/creational-pattern-demos/src/test/java/com/gsean/design/item03/item032/item0232/ClientTest.java new file mode 100644 index 0000000000000000000000000000000000000000..def013bace28d827145e7b880b3e79c06f5402b7 --- /dev/null +++ b/design-demos/creational-pattern-demos/src/test/java/com/gsean/design/item03/item032/item0232/ClientTest.java @@ -0,0 +1,76 @@ +package com.gsean.design.item03.item032.item0232; + +import org.junit.Test; + +/** + * @authoer Jincheng.Guo11 + * @description + * @date:created in 2021/12/2 16:46 + * @modificed by + **/ +public class ClientTest { + + private static Manager manager; + + static { + //设置审批链路:部门管理员(不高于1000)——CEO(不高于5000)——Boss(不高于10000) + manager = new Manager("部门管理员"); + manager.setNextApprover(new CEO("CEO")).setNextApprover(new Boss("Boss")); + } + /** + * 管理员审批通过 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/2 16:49 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + @Test + public void testA(){ + manager.approve(800); + } + + /** + * CEO审批通过 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/2 16:49 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + @Test + public void testB(){ + manager.approve(1500); + } + + /** + * Boss审批通过 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/2 16:49 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + @Test + public void testC(){ + manager.approve(6000); + } + + /** + * Boss驳回 + * + * @author: Jincheng.Guo11 + * @date: 2021/12/2 16:49 + * @return: void + * @throws: java.lang.Exception + * @modificed by: + */ + @Test + public void testD(){ + manager.approve(12000); + } + +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2f4d0666fbf012e730635efe5858a4adddd36224..fd0a634fd1edc63e237a743758b2f5c7f370be01 100644 --- a/pom.xml +++ b/pom.xml @@ -102,6 +102,13 @@ org.projectlombok lombok + + + org.springframework.boot + spring-boot-devtools + true + true + @@ -124,6 +131,16 @@ 8 + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + @@ -132,4 +149,6 @@ + + \ No newline at end of file