[新增功能](master): 更新了一些设计模式的代码
1. 状态,访问者,责任链模式 2. 装饰者,适配器,享元,组合模式 - ps : 组合模式还需要进一步学习下master
parent
9bfea90f0b
commit
ee0e9609f7
@ -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*
|
||||||
|
|
@ -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 总结
|
||||||
|
多个状态 -> 状态模式解决 -> 借助 状态机 解决
|
||||||
|
|
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>dev-protocol</artifactId>
|
||||||
|
<groupId>org.example</groupId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>dev-protocol-design-pattern</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>8</maven.compiler.source>
|
||||||
|
<maven.compiler.target>8</maven.compiler.target>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
@ -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);
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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 + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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("这是停止状态");
|
||||||
|
}
|
||||||
|
}
|
@ -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 当需要新加一个状态的时候,只需要新加一个状态类即可
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.baiye.design.behavioral.visitor;
|
||||||
|
|
||||||
|
public class FreeCourse extends Course{
|
||||||
|
@Override
|
||||||
|
public void accept(IVisitor visitor) {
|
||||||
|
visitor.visit(this);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.baiye.design.behavioral.visitor;
|
||||||
|
|
||||||
|
public interface IVisitor {
|
||||||
|
|
||||||
|
void visit(FreeCourse freeCourse);
|
||||||
|
|
||||||
|
void visit(CodingCourse codingCourse);
|
||||||
|
}
|
@ -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<Course> 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.baiye.design.structural.adapter.clazzadapter;
|
||||||
|
|
||||||
|
public class Adaptee {
|
||||||
|
public void adapteeRequest(){
|
||||||
|
System.out.println("被适配者的方法");
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
// 。。 在这里可以增加一些逻辑代码
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.baiye.design.structural.adapter.clazzadapter;
|
||||||
|
|
||||||
|
public class ConcreteTarget implements Target{
|
||||||
|
@Override
|
||||||
|
public void request() {
|
||||||
|
System.out.println("ConcreteTarget 目标方法");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.baiye.design.structural.adapter.clazzadapter;
|
||||||
|
|
||||||
|
public interface Target {
|
||||||
|
void request();
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.baiye.design.structural.adapter.objectadapter;
|
||||||
|
|
||||||
|
public class Adaptee {
|
||||||
|
public void adapteeRequest(){
|
||||||
|
System.out.println("被适配者的方法");
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
// 。。 在这里可以增加一些逻辑代码
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package com.baiye.design.structural.adapter.objectadapter;
|
||||||
|
|
||||||
|
|
||||||
|
public class ConcreteTarget implements Target{
|
||||||
|
@Override
|
||||||
|
public void request() {
|
||||||
|
System.out.println("ConcreteTarget 目标方法");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.baiye.design.structural.adapter.objectadapter;
|
||||||
|
|
||||||
|
public interface Target {
|
||||||
|
void request();
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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("不支持打印操作");
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package com.baiye.design.structural.composite;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CourseCatalog extends CatalogComponent {
|
||||||
|
|
||||||
|
List<CatalogComponent> 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;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.baiye.design.structural.composite;
|
||||||
|
|
||||||
|
public class Test {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// TODO: 2022/3/11 0011 补充资料
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.baiye.design.structural.decorator.v1;
|
||||||
|
|
||||||
|
public class Battercake {
|
||||||
|
|
||||||
|
protected String getDesc(){
|
||||||
|
return "煎饼";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int cost(){
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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());
|
||||||
|
|
||||||
|
// 有可能会出现类爆炸的情况
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
package com.baiye.design.structural.decorator.v2;
|
||||||
|
|
||||||
|
public abstract class ABattercake {
|
||||||
|
protected abstract String getDesc();
|
||||||
|
protected abstract int cost();
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.baiye.design.structural.flyweight;
|
||||||
|
|
||||||
|
public interface Employee {
|
||||||
|
void reprot();
|
||||||
|
}
|
@ -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<String, Employee> 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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue