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