diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index e3930e44..00000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.gitignore b/.gitignore index 07a840b1..efb4aab2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,3 @@ -# IntelliJ project files -.idea -*.iml -out -gen - - ### Java template # Compiled class file *.class @@ -30,3 +23,24 @@ gen # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* +### 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 + +### Example user template template +### Example user template + +# IntelliJ project files +.idea +*.iml +out +gen diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..73f69e09 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..da0415a0 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..6560a989 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,36 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..132404bc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 00000000..797acea5 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index a58fb0a4..be735807 100644 --- a/README.md +++ b/README.md @@ -1,15 +1 @@ -# 项目简介 -这是我Java学习过程中一些demo案例的汇总 - -现主要有Java的IO、Netty入门demo、设计模式的demo、MyBatis、MyBatis-Plus、Spring、Spring MVC、Spring Boot等 - -如: -- BIO、NIO、AIO实现聊天室;----> main分支 -- Netty的入门上手demo;----> main分支 -- 设计模式的基本原则和23种常用设计模式等;----> main分支 -- mybatis的使用,mybatis-plus的使用,自定义持久层框架 ----> mybatis分支 -- spring的使用,自定义IOC和AOP -----> spring分支 -- springMVC的使用,自定义MVC框架 -----> springmvc分支 -- springboot的使用,springboot-Starter的自定义 ----> springboot分支 -- 自定义Tomcat -----> tomcat分支 -- \ No newline at end of file +# 手写实现mini版Tomcat \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9fba93a3..284e70aa 100644 --- a/pom.xml +++ b/pom.xml @@ -4,8 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.fangpeng - study + com.lemon + Minicat 1.0-SNAPSHOT @@ -14,72 +14,32 @@ - - io.netty - netty-all - 4.1.56.Final - - - org.projectlombok - lombok - 1.16.18 - - - com.google.code.gson - gson - 2.8.5 - - - com.google.guava - guava - 19.0 - - - ch.qos.logback - logback-classic - 1.2.3 - - - com.google.protobuf - protobuf-java - 3.11.3 - - - cglib - cglib - 2.2.2 - dom4j dom4j 1.6.1 - redis.clients - jedis - 3.3.0 - - - - - org.quartz-scheduler - quartz - 2.3.2 + jaxen + jaxen + 1.1.6 + - - - - com.dangdang - elastic-job-lite-core - 2.1.5 - - - mysql - mysql-connector-java - 5.1.46 - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 8 + 8 + utf-8 + + + + \ No newline at end of file diff --git a/src/.DS_Store b/src/.DS_Store deleted file mode 100644 index 18fda3a5..00000000 Binary files a/src/.DS_Store and /dev/null differ diff --git a/src/main/.DS_Store b/src/main/.DS_Store deleted file mode 100644 index 8d3aae20..00000000 Binary files a/src/main/.DS_Store and /dev/null differ diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store deleted file mode 100644 index d12931e9..00000000 Binary files a/src/main/java/.DS_Store and /dev/null differ diff --git a/src/main/java/com/.DS_Store b/src/main/java/com/.DS_Store deleted file mode 100644 index 31128fdc..00000000 Binary files a/src/main/java/com/.DS_Store and /dev/null differ diff --git a/src/main/java/com/fangpeng/.DS_Store b/src/main/java/com/fangpeng/.DS_Store deleted file mode 100644 index 3350dc02..00000000 Binary files a/src/main/java/com/fangpeng/.DS_Store and /dev/null differ diff --git a/src/main/java/com/fangpeng/algorithm/hash/ConsistentHashNoVirtual.java b/src/main/java/com/fangpeng/algorithm/hash/ConsistentHashNoVirtual.java deleted file mode 100644 index 59964ffc..00000000 --- a/src/main/java/com/fangpeng/algorithm/hash/ConsistentHashNoVirtual.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.fangpeng.algorithm.hash; - -import java.util.SortedMap; -import java.util.TreeMap; - -/** - * @Description: 一致性hash算法 - * @Author : Lemon-CS - * @Date : 2022年03月03日 9:18 下午 - */ -public class ConsistentHashNoVirtual { - - // 1. 初始化:把服务器节点IP的哈希值对应到哈希环上 - // 2. 针对客户端IP求出hash值 - // 3. 针对客户端,找到能够处理当前客户端请求的服务器(哈希环上顺时针最近) - public static void main(String[] args) { - // step1 初始化:把服务器节点IP的哈希值对应到哈希环上 - // 定义服务器ip - String[] tomcatServers = new String[]{"123.111.0.0","123.101.3.1","111.20.35.2","123.98.26.3"}; - - SortedMap hashServerMap = new TreeMap<>(); - - for (String tomcatServer : tomcatServers) { - // 求出每一个ip的hash值,对应到hash环上,存储hash值与ip的对应关系 - int serverHash = Math.abs(tomcatServer.hashCode()); - // 存储hash值与ip的对应关系 - hashServerMap.put(serverHash, tomcatServer); - } - - // step2 针对客户端IP求出hash值 - // 定义客户端IP - String[] clients = new String[]{"10.78.12.3","113.25.63.1","126.12.3.8"}; - - for (String client : clients) { - int clientHash = Math.abs(client.hashCode()); - //step3 针对客户端,找到能够处理当前客户端请求的服务器(哈希环上顺时针最近) - // 根据客户端ip的哈希值去找出哪一个服务器节点能够处理() - SortedMap tailMap = hashServerMap.tailMap(clientHash); - - if (tailMap.isEmpty()) { - // 取哈希环上的顺时针第一台服务器 - Integer firstKey = hashServerMap.firstKey(); - System.out.println("==========>>>>客户端:" + client + " 被路由到服务器:" + hashServerMap.get(firstKey)); - } else { - // 取哈希环上的顺时针比它大的第一台服务器 - Integer nextKey = tailMap.firstKey(); - System.out.println("==========>>>>客户端:" + client + " 被路由到服务器:" + hashServerMap.get(nextKey)); - } - } - - } - -} diff --git a/src/main/java/com/fangpeng/algorithm/hash/ConsistentHashWithVirtual.java b/src/main/java/com/fangpeng/algorithm/hash/ConsistentHashWithVirtual.java deleted file mode 100644 index 26858639..00000000 --- a/src/main/java/com/fangpeng/algorithm/hash/ConsistentHashWithVirtual.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.fangpeng.algorithm.hash; - - -import java.util.SortedMap; -import java.util.TreeMap; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月03日 9:35 下午 - */ -public class ConsistentHashWithVirtual { - - public static void main(String[] args) { - - // step1 初始化:把服务器节点IP的哈希值对应到哈希环上 - // 定义服务器ip - String[] tomcatServers = new String[]{"123.111.0.0","123.101.3.1","111.20.35.2","123.98.26.3"}; - - SortedMap hashServerMap = new TreeMap<>(); - - // 定义针对每个真实服务器虚拟出来几个节点 - int virtaulCount = 3; - - - for(String tomcatServer: tomcatServers) { - // 求出每一个ip的hash值,对应到hash环上,存储hash值与ip的对应关系 - int serverHash = Math.abs(tomcatServer.hashCode()); - // 存储hash值与ip的对应关系 - hashServerMap.put(serverHash,tomcatServer); - - // 处理虚拟节点 - for(int i = 0; i < virtaulCount; i++) { - int virtualHash = Math.abs((tomcatServer + "#" + i).hashCode()); - hashServerMap.put(virtualHash,"----由虚拟节点"+ i + "映射过来的请求:"+ tomcatServer); - } - - } - - - // step2 针对客户端IP求出hash值 - // 定义客户端IP - String[] clients = new String[]{"10.78.12.3","113.25.63.1","126.12.3.8"}; - for(String client : clients) { - int clientHash = Math.abs(client.hashCode()); - // step3 针对客户端,找到能够处理当前客户端请求的服务器(哈希环上顺时针最近) - // 根据客户端ip的哈希值去找出哪一个服务器节点能够处理() - SortedMap integerStringSortedMap = hashServerMap.tailMap(clientHash); - if(integerStringSortedMap.isEmpty()) { - // 取哈希环上的顺时针第一台服务器 - Integer firstKey = hashServerMap.firstKey(); - System.out.println("==========>>>>客户端:" + client + " 被路由到服务器:" + hashServerMap.get(firstKey)); - }else{ - Integer nextKey = integerStringSortedMap.firstKey(); - System.out.println("==========>>>>客户端:" + client + " 被路由到服务器:" + hashServerMap.get(nextKey)); - } - } - } - -} diff --git a/src/main/java/com/fangpeng/algorithm/hash/GenetalHash.java b/src/main/java/com/fangpeng/algorithm/hash/GenetalHash.java deleted file mode 100644 index f8467f98..00000000 --- a/src/main/java/com/fangpeng/algorithm/hash/GenetalHash.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.algorithm.hash; - -/** - * @Description: 普通hash算法 - * @Author : Lemon-CS - * @Date : 2022年03月03日 9:14 下午 - */ -public class GenetalHash { - - public static void main(String[] args) { - // 定义客户端IP - String[] clients = new String[]{"10.78.12.3","113.25.63.1","126.12.3.8"}; - - // 定义服务器数量 - int serverCount = 5; // (编号对应0,1,2) - - // hash(ip) % node_counts = index - //根据index锁定应该路由到的tomcat服务器 - for (String client : clients) { - int hash = Math.abs(client.hashCode()); - int index = hash % serverCount; - System.out.println("客户端:" + client + " 被路由到服务器编号为:" + index); - } - - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/Client.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/Client.java deleted file mode 100644 index ce6b6fa4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/Client.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/** - * @author 方鹏 - * @date 2022年02月07日 8:51 下午 - */ -public class Client { - public static void main(String[] args) { - //创建计算机对象 - Computer computer = new Computer(); - //读取SD卡中的数据 - String msg = computer.readSD(new SDCardImpl()); - System.out.println(msg); - - System.out.println("==============="); - //使用该电脑读取TF卡中的数据 - //定义适配器类 - String msg1 = computer.readSD(new SDAdapterTF()); - System.out.println(msg1); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/Computer.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/Computer.java deleted file mode 100644 index a9a3ffeb..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/Computer.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/** - * 计算机类 - * @author 方鹏 - * @date 2022年02月07日 8:42 下午 - */ -public class Computer { - - //从SD卡中读取数据 - public String readSD(SDCard sdCard) { - if(sdCard == null) { - throw new NullPointerException("sd card is null"); - } - return sdCard.readSD(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDAdapterTF.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDAdapterTF.java deleted file mode 100644 index ecdc9ce5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDAdapterTF.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/** - * 适配器类 - * @author 方鹏 - * @date 2022年02月07日 8:47 下午 - */ -public class SDAdapterTF extends TFCardImpl implements SDCard { - @Override - public String readSD() { - System.out.println("adapter read tf card"); - return readTF(); - } - - @Override - public void writeSD(String msg) { - System.out.println("adapter write tf card"); - writeTF(msg); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDCard.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDCard.java deleted file mode 100644 index 6493462d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDCard.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/* - * 目标接口 - * @author 方鹏 - * @date 2022/2/7 8:43 下午 - */ -public interface SDCard { - - //从SD卡中读取数据 - String readSD(); - //往SD卡中写数据 - void writeSD(String msg); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDCardImpl.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDCardImpl.java deleted file mode 100644 index df916c37..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/SDCardImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/** - * 具体的SD卡 - * @author 方鹏 - * @date 2022年02月07日 8:47 下午 - */ -public class SDCardImpl implements SDCard { - - public String readSD() { - String msg = "SDCard read msg : hello word SD"; - return msg; - } - - public void writeSD(String msg) { - System.out.println("SDCard write msg :" + msg); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/TFCard.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/TFCard.java deleted file mode 100644 index f1ff5653..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/TFCard.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/* - * 适配者类的接口 - * @author 方鹏 - * @date 2022/2/7 8:44 下午 - */ -public interface TFCard { - - //从TF卡中读取数据 - String readTF(); - //往TF卡中写数据 - void writeTF(String msg); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/TFCardImpl.java b/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/TFCardImpl.java deleted file mode 100644 index 3c1cda80..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/class_adapter/TFCardImpl.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.adapter.class_adapter; - -/** - * 适配者类 - * @author 方鹏 - * @date 2022年02月07日 8:45 下午 - */ -public class TFCardImpl implements TFCard { - @Override - public String readTF() { - String msg = "TFCard read msg : hello word TFcard"; - return msg; - } - - @Override - public void writeTF(String msg) { - System.out.println("TFCard write msg :" + msg); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/Client.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/Client.java deleted file mode 100644 index 48ed6264..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/Client.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/** - * @author 方鹏 - * @date 2022年02月07日 8:51 下午 - */ -public class Client { - public static void main(String[] args) { - //创建计算机对象 - Computer computer = new Computer(); - //读取SD卡中的数据 - String msg = computer.readSD(new SDCardImpl()); - System.out.println(msg); - - System.out.println("==============="); - //使用该电脑读取TF卡中的数据 - //定义适配器类 - //使用该电脑读取TF卡中的数据 - //创建适配器类对象 - SDAdapterTF sdAdapterTF = new SDAdapterTF(new TFCardImpl()); - String msg1 = computer.readSD(sdAdapterTF); - System.out.println(msg1); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/Computer.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/Computer.java deleted file mode 100644 index 37272315..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/Computer.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/** - * 计算机类 - * @author 方鹏 - * @date 2022年02月07日 8:42 下午 - */ -public class Computer { - - //从SD卡中读取数据 - public String readSD(SDCard sdCard) { - if(sdCard == null) { - throw new NullPointerException("sd card is null"); - } - return sdCard.readSD(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDAdapterTF.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDAdapterTF.java deleted file mode 100644 index f963eb7d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDAdapterTF.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/** - * 适配器类 - * @author 方鹏 - * @date 2022年02月07日 8:47 下午 - */ -public class SDAdapterTF implements SDCard { - - //声明适配者类 - private TFCard tfCard; - - public SDAdapterTF(TFCard tfCard) { - this.tfCard = tfCard; - } - - @Override - public String readSD() { - System.out.println("adapter read tf card"); - return tfCard.readTF(); - } - - @Override - public void writeSD(String msg) { - System.out.println("adapter write tf card"); - tfCard.writeTF(msg); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDCard.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDCard.java deleted file mode 100644 index cfe17948..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDCard.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/* - * 目标接口 - * @author 方鹏 - * @date 2022/2/7 8:43 下午 - */ -public interface SDCard { - - //从SD卡中读取数据 - String readSD(); - //往SD卡中写数据 - void writeSD(String msg); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDCardImpl.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDCardImpl.java deleted file mode 100644 index dd1964c1..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/SDCardImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/** - * 具体的SD卡 - * @author 方鹏 - * @date 2022年02月07日 8:47 下午 - */ -public class SDCardImpl implements SDCard { - - public String readSD() { - String msg = "SDCard read msg : hello word SD"; - return msg; - } - - public void writeSD(String msg) { - System.out.println("SDCard write msg :" + msg); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/TFCard.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/TFCard.java deleted file mode 100644 index 0593fceb..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/TFCard.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/* - * 适配者类的接口 - * @author 方鹏 - * @date 2022/2/7 8:44 下午 - */ -public interface TFCard { - - //从TF卡中读取数据 - String readTF(); - //往TF卡中写数据 - void writeTF(String msg); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/TFCardImpl.java b/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/TFCardImpl.java deleted file mode 100644 index 128ff1cf..00000000 --- a/src/main/java/com/fangpeng/design/pattern/adapter/object_adapter/TFCardImpl.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.adapter.object_adapter; - -/** - * 适配者类 - * @author 方鹏 - * @date 2022年02月07日 8:45 下午 - */ -public class TFCardImpl implements TFCard { - @Override - public String readTF() { - String msg = "TFCard read msg : hello word TFcard"; - return msg; - } - - @Override - public void writeTF(String msg) { - System.out.println("TFCard write msg :" + msg); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/AviFile.java b/src/main/java/com/fangpeng/design/pattern/bridge/AviFile.java deleted file mode 100644 index 78d05ac5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/AviFile.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * avi视频文件(具体的实现化角色) - * @author 方鹏 - * @date 2022年02月08日 1:28 下午 - */ -public class AviFile implements VideoFile { - @Override - public void decode(String fileName) { - System.out.println("avi视频文件 :" + fileName); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/Client.java b/src/main/java/com/fangpeng/design/pattern/bridge/Client.java deleted file mode 100644 index 632d5f31..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/Client.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * @author 方鹏 - * @date 2022年02月08日 1:32 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建mac系统对象 - OpratingSystem system = new Mac(new AviFile()); - //使用操作系统播放视频文件 - system.play("战狼3"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/Mac.java b/src/main/java/com/fangpeng/design/pattern/bridge/Mac.java deleted file mode 100644 index 43185840..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/Mac.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * Mac操作系统(扩展抽象化角色) - * @author 方鹏 - * @date 2022年02月08日 1:32 下午 - */ -public class Mac extends OpratingSystem { - - public Mac(VideoFile videoFile) { - super(videoFile); - } - - @Override - public void play(String fileName) { - videoFile.decode(fileName); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/OpratingSystem.java b/src/main/java/com/fangpeng/design/pattern/bridge/OpratingSystem.java deleted file mode 100644 index bfa1ba17..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/OpratingSystem.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * 抽象的操作系统类(抽象化角色) - * @author 方鹏 - * @date 2022年02月08日 1:29 下午 - */ -public abstract class OpratingSystem { - - //声明videFile变量 - protected VideoFile videoFile; - - public OpratingSystem(VideoFile videoFile) { - this.videoFile = videoFile; - } - - public abstract void play(String fileName); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/RmvbFile.java b/src/main/java/com/fangpeng/design/pattern/bridge/RmvbFile.java deleted file mode 100644 index 54e37123..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/RmvbFile.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * rmvb视频文件(具体的实现化角色) - * @author 方鹏 - * @date 2022年02月08日 1:29 下午 - */ -public class RmvbFile implements VideoFile { - @Override - public void decode(String fileName) { - System.out.println("rmvb视频文件 :" + fileName); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/VideoFile.java b/src/main/java/com/fangpeng/design/pattern/bridge/VideoFile.java deleted file mode 100644 index 6cdf1765..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/VideoFile.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * 视频文件(实现化角色) - * @author 方鹏 - * @date 2022年02月08日 1:27 下午 - */ -public interface VideoFile { - - //解码功能 - void decode(String fileName); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/bridge/Windows.java b/src/main/java/com/fangpeng/design/pattern/bridge/Windows.java deleted file mode 100644 index f2277275..00000000 --- a/src/main/java/com/fangpeng/design/pattern/bridge/Windows.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.bridge; - -/** - * 扩展抽象化角色(windows操作系统) - * @author 方鹏 - * @date 2022年02月08日 1:30 下午 - */ -public class Windows extends OpratingSystem { - - public Windows(VideoFile videoFile) { - super(videoFile); - } - - @Override - public void play(String fileName) { - videoFile.decode(fileName); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Bike.java b/src/main/java/com/fangpeng/design/pattern/builder/demo1/Bike.java deleted file mode 100644 index abee7d97..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Bike.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo1; - -/** - * 产品对象 - * @author 方鹏 - * @date 2022年02月07日 5:23 下午 - */ -public class Bike { - - private String frame;//车架 - - private String seat;//车座 - - public String getFrame() { - return frame; - } - - public void setFrame(String frame) { - this.frame = frame; - } - - public String getSeat() { - return seat; - } - - public void setSeat(String seat) { - this.seat = seat; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Builder.java b/src/main/java/com/fangpeng/design/pattern/builder/demo1/Builder.java deleted file mode 100644 index a4a7e663..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Builder.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo1; - -/** - * Builder - * @author 方鹏 - * @date 2022年02月07日 5:24 下午 - */ -public abstract class Builder { - - //声明Bike类型的变量,并进行赋值 - protected Bike bike = new Bike(); - - public abstract void buildFrame(); - - public abstract void buildSeat(); - - //构建自行车的方法 - public abstract Bike createBike(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Client.java b/src/main/java/com/fangpeng/design/pattern/builder/demo1/Client.java deleted file mode 100644 index e8f474b5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Client.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo1; - - -/** - * @author 方鹏 - * @date 2022年02月07日 5:30 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建指挥者对象 - Director director = new Director(new MobileBuilder()); - - //让指挥者只会组装自行车 - Bike bike = director.construct(); - - System.out.println(bike.getFrame()); - System.out.println(bike.getSeat()); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Director.java b/src/main/java/com/fangpeng/design/pattern/builder/demo1/Director.java deleted file mode 100644 index 5ec7dae2..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo1/Director.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo1; - -/** - * @author 方鹏 - * @date 2022年02月07日 5:28 下午 - */ -public class Director { - - //声明builder类型的变量 - private Builder builder; - - public Director(Builder builder) { - this.builder = builder; - } - - //组装自行车的功能 - public Bike construct() { - builder.buildFrame(); - builder.buildSeat(); - return builder.createBike(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo1/MobileBuilder.java b/src/main/java/com/fangpeng/design/pattern/builder/demo1/MobileBuilder.java deleted file mode 100644 index 4a353703..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo1/MobileBuilder.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo1; - -/** - * MobileBuilder - * @author 方鹏 - * @date 2022年02月07日 5:25 下午 - */ -public class MobileBuilder extends Builder { - @Override - public void buildFrame() { - bike.setFrame("碳纤维车架"); - } - - @Override - public void buildSeat() { - bike.setSeat("真皮车座"); - } - - @Override - public Bike createBike() { - return bike; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo1/OfoBuilder.java b/src/main/java/com/fangpeng/design/pattern/builder/demo1/OfoBuilder.java deleted file mode 100644 index bc01c2c8..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo1/OfoBuilder.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo1; - -/** - * OfoBuilder - * @author 方鹏 - * @date 2022年02月07日 5:25 下午 - */ -public class OfoBuilder extends Builder { - @Override - public void buildFrame() { - bike.setFrame("铝合金车架"); - } - - @Override - public void buildSeat() { - bike.setSeat("橡胶车座"); - } - - @Override - public Bike createBike() { - return bike; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo2/Client.java b/src/main/java/com/fangpeng/design/pattern/builder/demo2/Client.java deleted file mode 100644 index b54fac23..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo2/Client.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo2; - -/** - * @author 方鹏 - * @date 2022年02月07日 5:46 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建手机对象 通过构建者对象获取手机对象 - Phone phone = new Phone.Builder() - .cpu("intel") - .screen("三星屏幕") - .memory("金士顿内存条") - .mainboard("华硕主板") - .build(); - - System.out.println(phone); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/builder/demo2/Phone.java b/src/main/java/com/fangpeng/design/pattern/builder/demo2/Phone.java deleted file mode 100644 index 78f27b54..00000000 --- a/src/main/java/com/fangpeng/design/pattern/builder/demo2/Phone.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.fangpeng.design.pattern.builder.demo2; - -/** - * 手机类 - * @author 方鹏 - * @date 2022年02月07日 5:41 下午 - */ -public class Phone { - - private String cpu; - private String screen; - private String memory; - private String mainboard; - - //私有构造方法 - private Phone(Builder builder) { - this.cpu = builder.cpu; - this.screen = builder.screen; - this.memory = builder.memory; - this.mainboard = builder.mainboard; - } - - @Override - public String toString() { - return "Phone{" + - "cpu='" + cpu + '\'' + - ", screen='" + screen + '\'' + - ", memory='" + memory + '\'' + - ", mainboard='" + mainboard + '\'' + - '}'; - } - - public static final class Builder { - private String cpu; - private String screen; - private String memory; - private String mainboard; - - public Builder cpu(String cpu) { - this.cpu = cpu; - return this; - } - - public Builder screen(String screen) { - this.screen = screen; - return this; - } - public Builder memory(String memory) { - this.memory = memory; - return this; - } - public Builder mainboard(String mainboard) { - this.mainboard = mainboard; - return this; - } - - //使用构建者创建Phone对象 - public Phone build() { - return new Phone(this); - } - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/combination/Client.java b/src/main/java/com/fangpeng/design/pattern/combination/Client.java deleted file mode 100644 index 423933e6..00000000 --- a/src/main/java/com/fangpeng/design/pattern/combination/Client.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.design.pattern.combination; - -/** - * @author 方鹏 - * @date 2022年02月08日 2:13 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建菜单树 - MenuComponent menu1 = new Menu("菜单管理",2); - menu1.add(new MenuItem("页面访问",3)); - menu1.add(new MenuItem("展开菜单",3)); - menu1.add(new MenuItem("编辑菜单",3)); - menu1.add(new MenuItem("删除菜单",3)); - menu1.add(new MenuItem("新增菜单",3)); - - MenuComponent menu2 = new Menu("权限管理",2); - menu2.add(new MenuItem("页面访问",3)); - menu2.add(new MenuItem("提交保存",3)); - - MenuComponent menu3 = new Menu("角色管理",2); - menu3.add(new MenuItem("页面访问",3)); - menu3.add(new MenuItem("新增角色",3)); - menu3.add(new MenuItem("修改角色",3)); - - //创建一级菜单 - MenuComponent component = new Menu("系统管理",1); - //将二级菜单添加到一级菜单中 - component.add(menu1); - component.add(menu2); - component.add(menu3); - - - //打印菜单名称(如果有子菜单一块打印) - component.print(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/combination/Menu.java b/src/main/java/com/fangpeng/design/pattern/combination/Menu.java deleted file mode 100644 index 31cfe758..00000000 --- a/src/main/java/com/fangpeng/design/pattern/combination/Menu.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.fangpeng.design.pattern.combination; - -import java.util.ArrayList; -import java.util.List; - -/** - * 菜单类 : 属于树枝节点 - * @author 方鹏 - * @date 2022年02月08日 2:06 下午 - */ -public class Menu extends MenuComponent { - - //菜单可以有多个子菜单或者子菜单项 - private List menuComponentList = new ArrayList<>(); - - //构造方法 - public Menu(String name, int level) { - this.name = name; - this.level = level; - } - - @Override - public void add(MenuComponent menuComponent) { - menuComponentList.add(menuComponent); - } - - @Override - public void remove(MenuComponent menuComponent) { - menuComponentList.remove(menuComponent); - } - - @Override - public MenuComponent getChild(int index) { - return menuComponentList.get(index); - } - - @Override - public void print() { - //打印菜单名称 - for(int i = 0; i < level; i++) { - System.out.print("--|"); - } - System.out.println(name); - - //打印子菜单或者子菜单项名称 - for (MenuComponent component : menuComponentList) { - component.print(); - } - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/combination/MenuComponent.java b/src/main/java/com/fangpeng/design/pattern/combination/MenuComponent.java deleted file mode 100644 index 0307ad80..00000000 --- a/src/main/java/com/fangpeng/design/pattern/combination/MenuComponent.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fangpeng.design.pattern.combination; - -/** - * 菜单组件 : 属于抽象根节点 - * @author 方鹏 - * @date 2022年02月08日 2:02 下午 - */ -public abstract class MenuComponent { - - //菜单组件的名称 - protected String name; - //菜单组件的层级 - protected int level; - - //添加子菜单 - public void add(MenuComponent menuComponent) { - throw new UnsupportedOperationException(); - } - - //移除子菜单 - public void remove(MenuComponent menuComponent) { - throw new UnsupportedOperationException(); - } - - //获取指定的子菜单 - public MenuComponent getChild(int index) { - throw new UnsupportedOperationException(); - } - - //获取菜单或者菜单项的名称 - public String getName() { - return name; - } - - //打印菜单名称的方法(包含子菜单和字菜单项) - public abstract void print(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/combination/MenuItem.java b/src/main/java/com/fangpeng/design/pattern/combination/MenuItem.java deleted file mode 100644 index a2db6723..00000000 --- a/src/main/java/com/fangpeng/design/pattern/combination/MenuItem.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.design.pattern.combination; - -/** - * 菜单项类 : 属于叶子节点 - * @author 方鹏 - * @date 2022年02月08日 2:12 下午 - */ -public class MenuItem extends MenuComponent { - - public MenuItem(String name,int level) { - this.name = name; - this.level = level; - } - - @Override - public void print() { - //打印菜单项的名称 - for(int i = 0; i < level; i++) { - System.out.print("--|"); - } - System.out.println(name); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/command/Client.java b/src/main/java/com/fangpeng/design/pattern/command/Client.java deleted file mode 100644 index 4d238c4b..00000000 --- a/src/main/java/com/fangpeng/design/pattern/command/Client.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fangpeng.design.pattern.command; - -/** - * @author 方鹏 - * @date 2022年02月08日 4:10 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建第一个订单对象 - Order order1 = new Order(); - order1.setDiningTable(1); - order1.setFood("西红柿鸡蛋面",1); - order1.setFood("小杯可乐",2); - - //创建第二个订单对象 - Order order2 = new Order(); - order2.setDiningTable(2); - order2.setFood("尖椒肉丝盖饭",1); - order2.setFood("小杯雪碧",1); - - //创建厨师对象 - SeniorChef receiver = new SeniorChef(); - //创建命令对象 - OrderCommand cmd1 = new OrderCommand(receiver,order1); - OrderCommand cmd2 = new OrderCommand(receiver,order2); - - //创建调用者(服务员对象) - Waitor invoke = new Waitor(); - invoke.setCommand(cmd1); - invoke.setCommand(cmd2); - - //让服务员发起命令 - invoke.orderUp(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/command/Command.java b/src/main/java/com/fangpeng/design/pattern/command/Command.java deleted file mode 100644 index 95a6f348..00000000 --- a/src/main/java/com/fangpeng/design/pattern/command/Command.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.command; - -/** - * 抽象命令类 - * @author 方鹏 - * @date 2022年02月08日 4:04 下午 - */ -public interface Command { - - void execute(); -} diff --git a/src/main/java/com/fangpeng/design/pattern/command/Order.java b/src/main/java/com/fangpeng/design/pattern/command/Order.java deleted file mode 100644 index 66e8c412..00000000 --- a/src/main/java/com/fangpeng/design/pattern/command/Order.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.fangpeng.design.pattern.command; - -import java.util.HashMap; -import java.util.Map; - -/** - * 订单类 - * @author 方鹏 - * @date 2022年02月08日 4:02 下午 - */ -public class Order { - //餐桌号码 - private int diningTable; - - //所下的餐品及份数 - private Map foodDir = new HashMap<>(); - - public int getDiningTable() { - return diningTable; - } - - public void setDiningTable(int diningTable) { - this.diningTable = diningTable; - } - - public Map getFoodDir() { - return foodDir; - } - - public void setFood(String name, int num) { - foodDir.put(name,num); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/command/OrderCommand.java b/src/main/java/com/fangpeng/design/pattern/command/OrderCommand.java deleted file mode 100644 index add13774..00000000 --- a/src/main/java/com/fangpeng/design/pattern/command/OrderCommand.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.fangpeng.design.pattern.command; - -import java.util.Map; -import java.util.Set; - -/** - * 具体的命令类 - * @author 方鹏 - * @date 2022年02月08日 4:05 下午 - */ -public class OrderCommand implements Command { - - //持有接收者对象 - private SeniorChef receiver; - private Order order; - - public OrderCommand(SeniorChef receiver, Order order) { - this.receiver = receiver; - this.order = order; - } - - @Override - public void execute() { - System.out.println(order.getDiningTable() + "桌的订单:"); - Map foodDir = order.getFoodDir(); - //遍历map集合 - Set keys = foodDir.keySet(); - for (String foodName : keys) { - receiver.makeFood(foodName, foodDir.get(foodName)); - } - - System.out.println(order.getDiningTable() + "桌的饭准备完毕!!!"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/command/SeniorChef.java b/src/main/java/com/fangpeng/design/pattern/command/SeniorChef.java deleted file mode 100644 index 066d0e43..00000000 --- a/src/main/java/com/fangpeng/design/pattern/command/SeniorChef.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.command; - -/** - * 厨师类 - * @author 方鹏 - * @date 2022年02月08日 4:04 下午 - */ -public class SeniorChef { - - public void makeFood(String name,int num) { - System.out.println("厨师制作:" + num + "份" + name); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/command/Waitor.java b/src/main/java/com/fangpeng/design/pattern/command/Waitor.java deleted file mode 100644 index bb6065ee..00000000 --- a/src/main/java/com/fangpeng/design/pattern/command/Waitor.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.fangpeng.design.pattern.command; - -import java.util.ArrayList; -import java.util.List; - -/** - * 服务员类(属于请求者角色) - * @author 方鹏 - * @date 2022年02月08日 4:08 下午 - */ -public class Waitor { - - //持有多个命令对象 - private List commands = new ArrayList(); - - public void setCommand(Command cmd) { - //将cmd对象存储到list集合中 - commands.add(cmd); - } - - //发起命令功能 喊 订单来了 - public void orderUp() { - System.out.println("美女服务员:大厨,新订单来了。。。。"); - //遍历list集合 - for (Command command : commands) { - if(command != null) { - command.execute(); - } - } - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/Bacon.java b/src/main/java/com/fangpeng/design/pattern/decorator/Bacon.java deleted file mode 100644 index efd6cf2b..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/Bacon.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** - * 培根类(具体的装饰者角色) - * @author 方鹏 - * @date 2022年02月07日 9:33 下午 - */ -public class Bacon extends Garnish { - - public Bacon(FastFood fastFood) { - super(fastFood,2,"培根"); - } - - @Override - public float cost() { - //计算价格 - return getPrice() + getFastFood().cost(); - } - - @Override - public String getDesc() { - return super.getDesc() + getFastFood().getDesc(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/Client.java b/src/main/java/com/fangpeng/design/pattern/decorator/Client.java deleted file mode 100644 index f0f8272c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/Client.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** - * @author 方鹏 - * @date 2022年02月07日 9:33 下午 - */ -public class Client { - - public static void main(String[] args) { - //点一份炒饭 - FastFood food = new FriedRice(); - - System.out.println(food.getDesc() + " " + food.cost() + "元"); - - System.out.println("==============="); - - //在上面的炒饭中加一个鸡蛋 - food = new Egg(food); - System.out.println(food.getDesc() + " " + food.cost() + "元"); - - System.out.println("================"); - //再加一个鸡蛋 - food = new Egg(food); - System.out.println(food.getDesc() + " " + food.cost() + "元"); - - System.out.println("================"); - food = new Bacon(food); - System.out.println(food.getDesc() + " " + food.cost() + "元"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/Egg.java b/src/main/java/com/fangpeng/design/pattern/decorator/Egg.java deleted file mode 100644 index ca84e5bc..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/Egg.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** - * 鸡蛋类(具体的装饰者角色) - * @author 方鹏 - * @date 2022年02月07日 9:30 下午 - */ -public class Egg extends Garnish { - - public Egg(FastFood fastFood) { - super(fastFood, 1, "鸡蛋"); - } - - @Override - public float cost() { - //计算价格 - return getPrice() + getFastFood().cost(); - } - - @Override - public String getDesc() { - return super.getDesc() + getFastFood().getDesc(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/FastFood.java b/src/main/java/com/fangpeng/design/pattern/decorator/FastFood.java deleted file mode 100644 index dc884268..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/FastFood.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** - * 快餐类(抽象构件角色) - * @author 方鹏 - * @date 2022年02月07日 9:24 下午 - */ -public abstract class FastFood { - - private float price;//价格 - private String desc; //描述 - - public float getPrice() { - return price; - } - - public void setPrice(float price) { - this.price = price; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } - - public FastFood(float price, String desc) { - this.price = price; - this.desc = desc; - } - - public FastFood() { - } - - public abstract float cost(); -} - diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/FriedNoodles.java b/src/main/java/com/fangpeng/design/pattern/decorator/FriedNoodles.java deleted file mode 100644 index 7c32f0b7..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/FriedNoodles.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** - * @author 方鹏 - * @date 2022年02月07日 9:27 下午 - */ -public class FriedNoodles extends FastFood { - - public FriedNoodles() { - super(12,"炒面"); - } - - @Override - public float cost() { - return getPrice(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/FriedRice.java b/src/main/java/com/fangpeng/design/pattern/decorator/FriedRice.java deleted file mode 100644 index 6eda3d40..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/FriedRice.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** - * 炒饭(具体构件角色) - * @author 方鹏 - * @date 2022年02月07日 9:26 下午 - */ -public class FriedRice extends FastFood { - - public FriedRice() { - super(10,"炒饭"); - } - - @Override - public float cost() { - return getPrice(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/decorator/Garnish.java b/src/main/java/com/fangpeng/design/pattern/decorator/Garnish.java deleted file mode 100644 index 1529dbb0..00000000 --- a/src/main/java/com/fangpeng/design/pattern/decorator/Garnish.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.fangpeng.design.pattern.decorator; - -/** 装饰者类(抽象装饰者角色) - * @author 方鹏 - * @date 2022年02月07日 9:29 下午 - */ -public abstract class Garnish extends FastFood { - - //声明快餐类的变量 - private FastFood fastFood; - - public FastFood getFastFood() { - return fastFood; - } - - public void setFastFood(FastFood fastFood) { - this.fastFood = fastFood; - } - - public Garnish(FastFood fastFood, float price, String desc) { - super(price, desc); - this.fastFood = fastFood; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/facade/AirCondition.java b/src/main/java/com/fangpeng/design/pattern/facade/AirCondition.java deleted file mode 100644 index 62109ebb..00000000 --- a/src/main/java/com/fangpeng/design/pattern/facade/AirCondition.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.facade; - -/** - * 空调类 - * @author 方鹏 - * @date 2022年02月08日 1:42 下午 - */ -public class AirCondition { - - public void on() { - System.out.println("打开空调。。。。"); - } - - public void off() { - System.out.println("关闭空调。。。。"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/facade/Client.java b/src/main/java/com/fangpeng/design/pattern/facade/Client.java deleted file mode 100644 index 779a4e40..00000000 --- a/src/main/java/com/fangpeng/design/pattern/facade/Client.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.facade; - -/** - * @author 方鹏 - * @date 2022年02月08日 1:46 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建智能音箱对象 - SmartAppliancesFacade facade = new SmartAppliancesFacade(); - //控制家电 - facade.say("打开家电"); - - System.out.println("=================="); - - facade.say("关闭家电"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/facade/Light.java b/src/main/java/com/fangpeng/design/pattern/facade/Light.java deleted file mode 100644 index 359d818a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/facade/Light.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.facade; - -/** - * 电灯类 - * @author 方鹏 - * @date 2022年02月08日 1:41 下午 - */ -public class Light { - - //开灯 - public void on() { - System.out.println("打开电灯。。。。"); - } - - //关灯 - public void off() { - System.out.println("关闭电灯。。。。"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/facade/SmartAppliancesFacade.java b/src/main/java/com/fangpeng/design/pattern/facade/SmartAppliancesFacade.java deleted file mode 100644 index 312c5743..00000000 --- a/src/main/java/com/fangpeng/design/pattern/facade/SmartAppliancesFacade.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.fangpeng.design.pattern.facade; - -/** - * 外观类,用户主要和该类对象进行交互 - * @author 方鹏 - * @date 2022年02月08日 1:42 下午 - */ -public class SmartAppliancesFacade { - - //聚合电灯对象,电视机对象,空调对象 - private Light light; - private TV tv; - private AirCondition airCondition; - - public SmartAppliancesFacade() { - light = new Light(); - tv = new TV(); - airCondition = new AirCondition(); - } - - //通过语言控制 - public void say(String message) { - if(message.contains("打开")) { - on(); - } else if(message.contains("关闭")) { - off(); - } else { - System.out.println("我还听不懂你说的!!!"); - } - } - - - //一键打开功能 - private void on() { - light.on(); - tv.on(); - airCondition.on(); - } - - //一键关闭功能 - private void off() { - light.off(); - tv.off(); - airCondition.off(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/facade/TV.java b/src/main/java/com/fangpeng/design/pattern/facade/TV.java deleted file mode 100644 index 5a821343..00000000 --- a/src/main/java/com/fangpeng/design/pattern/facade/TV.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.facade; - -/** - * 电视机类 - * @author 方鹏 - * @date 2022年02月08日 1:41 下午 - */ -public class TV { - - public void on() { - System.out.println("打开电视机。。。。"); - } - - public void off() { - System.out.println("关闭电视机。。。。"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/AmericanCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/AmericanCoffee.java deleted file mode 100644 index c75f4d7d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/AmericanCoffee.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 美式咖啡 - */ -public class AmericanCoffee extends Coffee { - - public String getName() { - return "美式咖啡"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/AmericanDessertFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/AmericanDessertFactory.java deleted file mode 100644 index 87061eda..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/AmericanDessertFactory.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 美式风味的甜品工厂:生产美式咖啡和抹茶慕斯 - */ -public class AmericanDessertFactory implements DessertFactory { - @Override - public Coffee createCoffee() { - return new AmericanCoffee(); - } - - @Override - public Dessert createDessert() { - return new MatchaMousse(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Client.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Client.java deleted file mode 100644 index c5b61484..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Client.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -public class Client { - - public static void main(String[] args) { - //创建的是意大利风味甜品工厂对象 - //ItalyDessertFactory factory = new ItalyDessertFactory(); - AmericanDessertFactory factory = new AmericanDessertFactory(); - //获取拿铁咖啡和提拉米苏甜品 - Coffee coffee = factory.createCoffee(); - Dessert dessert = factory.createDessert(); - - System.out.println(coffee.getName()); - dessert.show(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Coffee.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Coffee.java deleted file mode 100644 index ef3a6ce8..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Coffee.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 咖啡类 - */ -public abstract class Coffee { - - public abstract String getName(); - - //加糖 - public void addSugar() { - System.out.println("加糖"); - } - - //加奶 - public void addMilk() { - System.out.println("加奶"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Dessert.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Dessert.java deleted file mode 100644 index cabc8d6d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Dessert.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 甜品抽象类 - */ -public abstract class Dessert { - - public abstract void show(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/DessertFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/DessertFactory.java deleted file mode 100644 index 29ee6d57..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/DessertFactory.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -public interface DessertFactory { - - //生产咖啡的功能 - Coffee createCoffee(); - - //生产甜品的功能 - Dessert createDessert(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/ItalyDessertFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/ItalyDessertFactory.java deleted file mode 100644 index 54134188..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/ItalyDessertFactory.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 意大利风味甜品工厂:生产拿铁咖啡和提拉米苏甜品 - */ -public class ItalyDessertFactory implements DessertFactory { - @Override - public Coffee createCoffee() { - return new LatteCoffee(); - } - - @Override - public Dessert createDessert() { - return new Trimisu(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/LatteCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/LatteCoffee.java deleted file mode 100644 index ef73e645..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/LatteCoffee.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 拿铁咖啡 - */ -public class LatteCoffee extends Coffee { - - public String getName() { - return "拿铁咖啡"; - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/MatchaMousse.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/MatchaMousse.java deleted file mode 100644 index 46946480..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/MatchaMousse.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 抹茶慕斯类 - */ -public class MatchaMousse extends Dessert { - @Override - public void show() { - System.out.println("抹茶慕斯"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Trimisu.java b/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Trimisu.java deleted file mode 100644 index e7dc7d28..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/abstract_factory/Trimisu.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.abstract_factory; - -/* - 提拉米苏类 - */ -public class Trimisu extends Dessert { - @Override - public void show() { - System.out.println("提拉米苏"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/before/AmericanCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/before/AmericanCoffee.java deleted file mode 100644 index a6f62589..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/before/AmericanCoffee.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.factory.before; - -/* - 美式咖啡 - */ -public class AmericanCoffee extends Coffee { - - public String getName() { - return "美式咖啡"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/factory/before/Client.java b/src/main/java/com/fangpeng/design/pattern/factory/before/Client.java deleted file mode 100644 index acc5720f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/before/Client.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.factory.before; - -public class Client { - - public static void main(String[] args) { - //1,创建咖啡店类 - CoffeeStore store = new CoffeeStore(); - //2,点咖啡 - Coffee coffee = store.orderCoffee("american"); - - System.out.println(coffee.getName()); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/before/Coffee.java b/src/main/java/com/fangpeng/design/pattern/factory/before/Coffee.java deleted file mode 100644 index b48d5c54..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/before/Coffee.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.factory.before; - -/* - 咖啡类 - */ -public abstract class Coffee { - - public abstract String getName(); - - //加糖 - public void addSugar() { - System.out.println("加糖"); - } - - //加奶 - public void addMilk() { - System.out.println("加奶"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/before/CoffeeStore.java b/src/main/java/com/fangpeng/design/pattern/factory/before/CoffeeStore.java deleted file mode 100644 index 96038e69..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/before/CoffeeStore.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.factory.before; - -public class CoffeeStore { - - public Coffee orderCoffee(String type) { - //声明Coffee类型的变量,根据不同类型创建不同的coffee子类对象 - Coffee coffee = null; - if("american".equals(type)) { - coffee = new AmericanCoffee(); - } else if("latte".equals(type)) { - coffee = new LatteCoffee(); - } else { - throw new RuntimeException("对不起,您所点的咖啡没有"); - } - //加配料 - coffee.addMilk(); - coffee.addSugar(); - - return coffee; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/before/LatteCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/before/LatteCoffee.java deleted file mode 100644 index 19a15311..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/before/LatteCoffee.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.before; - -/* - 拿铁咖啡 - */ -public class LatteCoffee extends Coffee { - - public String getName() { - return "拿铁咖啡"; - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/AmericanCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/config_factory/AmericanCoffee.java deleted file mode 100644 index 6895f839..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/AmericanCoffee.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.factory.config_factory; - -/* - 美式咖啡 - */ -public class AmericanCoffee extends Coffee { - - public String getName() { - return "美式咖啡"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/Client.java b/src/main/java/com/fangpeng/design/pattern/factory/config_factory/Client.java deleted file mode 100644 index 5b6fa0d9..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/Client.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.factory.config_factory; - -public class Client { - - public static void main(String[] args) { - Coffee coffee = CoffeeFactory.createCoffee("american"); - System.out.println(coffee.getName()); - - System.out.println("============="); - Coffee latte = CoffeeFactory.createCoffee("latte"); - System.out.println(latte.getName()); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/Coffee.java b/src/main/java/com/fangpeng/design/pattern/factory/config_factory/Coffee.java deleted file mode 100644 index b4ca156d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/Coffee.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.factory.config_factory; - -/* - 咖啡类 - */ -public abstract class Coffee { - - public abstract String getName(); - - //加糖 - public void addSugar() { - System.out.println("加糖"); - } - - //加奶 - public void addMilk() { - System.out.println("加奶"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/CoffeeFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/config_factory/CoffeeFactory.java deleted file mode 100644 index 963bea42..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/CoffeeFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.fangpeng.design.pattern.factory.config_factory; - -import com.sun.xml.internal.bind.v2.ClassFactory; - -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - -public class CoffeeFactory { - - //加载配置文件,获取配置文件中配置的全类名,并创建该类的对象进行存储 - //1,定义容器对象存储咖啡对象 - private static Map map = new HashMap<>(); - - //2,加载配置文件, 只需要加载一次 - static { - //2.1 创建Properties对象 - Properties p = new Properties(); - //2.2 调用p对象中的load方法进行配置文件的加载 - InputStream is = ClassFactory.class.getClassLoader().getResourceAsStream("bean.properties"); - try { - p.load(is); - //从p集合中获取全类名并创建对象 - Set keys = p.keySet(); - for (Object key : keys) { - String className = p.getProperty((String) key); - //通过反射技术创建对象 - Class clazz = Class.forName(className); - Coffee coffee = (Coffee) clazz.newInstance(); - //将名称和对象存储到容器中 - map.put((String)key, coffee); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - //根据名称获取对象 - public static Coffee createCoffee(String name) { - return map.get(name); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/LatteCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/config_factory/LatteCoffee.java deleted file mode 100644 index 0f6dce18..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/config_factory/LatteCoffee.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.config_factory; - -/* - 拿铁咖啡 - */ -public class LatteCoffee extends Coffee { - - public String getName() { - return "拿铁咖啡"; - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/AmericanCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/AmericanCoffee.java deleted file mode 100644 index 692cbedf..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/AmericanCoffee.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -/* - 美式咖啡 - */ -public class AmericanCoffee extends Coffee { - - public String getName() { - return "美式咖啡"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/AmericanCoffeeFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/AmericanCoffeeFactory.java deleted file mode 100644 index 7c96f956..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/AmericanCoffeeFactory.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -public class AmericanCoffeeFactory implements CoffeeFactory { - @Override - public Coffee createCoffee() { - return new AmericanCoffee(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/Client.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/Client.java deleted file mode 100644 index 6a38d3ca..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/Client.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -public class Client { - - public static void main(String[] args) { - //1,创建咖啡店类 - CoffeeStore store = new CoffeeStore(); - store.setFactory(new AmericanCoffeeFactory()); - //2,点咖啡 - Coffee coffee = store.orderCoffee(); - - System.out.println(coffee.getName()); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/Coffee.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/Coffee.java deleted file mode 100644 index 0eeda4bd..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/Coffee.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -/* - 咖啡类 - */ -public abstract class Coffee { - - public abstract String getName(); - - //加糖 - public void addSugar() { - System.out.println("加糖"); - } - - //加奶 - public void addMilk() { - System.out.println("加奶"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/CoffeeFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/CoffeeFactory.java deleted file mode 100644 index af37f98a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/CoffeeFactory.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -/* - CoffeeFactory : 抽象工厂 - */ -public interface CoffeeFactory { - - //创建咖啡对象的方法 - Coffee createCoffee(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/CoffeeStore.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/CoffeeStore.java deleted file mode 100644 index de67807e..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/CoffeeStore.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -import com.fangpeng.design.pattern.factory.simple_factory.SimpleCoffeeFactory; - -public class CoffeeStore { - - private CoffeeFactory factory; - - public void setFactory(CoffeeFactory factory) { - this.factory = factory; - } - - public Coffee orderCoffee() { - - Coffee coffee = factory.createCoffee(); - - //加配料 - coffee.addMilk(); - coffee.addSugar(); - - return coffee; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/LatteCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/LatteCoffee.java deleted file mode 100644 index 81d191be..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/LatteCoffee.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -/* - 拿铁咖啡 - */ -public class LatteCoffee extends Coffee { - - public String getName() { - return "拿铁咖啡"; - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/LatteCoffeeFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/factory_method/LatteCoffeeFactory.java deleted file mode 100644 index 1e22e32a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/factory_method/LatteCoffeeFactory.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.pattern.factory.factory_method; - -public class LatteCoffeeFactory implements CoffeeFactory { - @Override - public Coffee createCoffee() { - return new LatteCoffee(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/AmericanCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/AmericanCoffee.java deleted file mode 100644 index 31c593dc..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/AmericanCoffee.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.factory.simple_factory; - -/* - 美式咖啡 - */ -public class AmericanCoffee extends Coffee { - - public String getName() { - return "美式咖啡"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/Client.java b/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/Client.java deleted file mode 100644 index 837a90c5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/Client.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.factory.simple_factory; - -public class Client { - - public static void main(String[] args) { - //1,创建咖啡店类 - CoffeeStore store = new CoffeeStore(); - //2,点咖啡 - Coffee coffee = store.orderCoffee("american"); - - System.out.println(coffee.getName()); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/Coffee.java b/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/Coffee.java deleted file mode 100644 index 25e20b6d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/Coffee.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.factory.simple_factory; - -/* - 咖啡类 - */ -public abstract class Coffee { - - public abstract String getName(); - - //加糖 - public void addSugar() { - System.out.println("加糖"); - } - - //加奶 - public void addMilk() { - System.out.println("加奶"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/CoffeeStore.java b/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/CoffeeStore.java deleted file mode 100644 index af08dc96..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/CoffeeStore.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.pattern.factory.simple_factory; - -public class CoffeeStore { - - public Coffee orderCoffee(String type) { - SimpleCoffeeFactory factory = new SimpleCoffeeFactory(); - //调用生产咖啡的方法 - Coffee coffee = factory.createCoffee(type); - - //加配料 - coffee.addMilk(); - coffee.addSugar(); - - return coffee; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/LatteCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/LatteCoffee.java deleted file mode 100644 index f4d4a834..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/LatteCoffee.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.simple_factory; - -/* - 拿铁咖啡 - */ -public class LatteCoffee extends Coffee { - - public String getName() { - return "拿铁咖啡"; - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/SimpleCoffeeFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/SimpleCoffeeFactory.java deleted file mode 100644 index 6be44db0..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/simple_factory/SimpleCoffeeFactory.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.factory.simple_factory; - -/* - 简单咖啡工厂类,用来生产咖啡 - */ -public class SimpleCoffeeFactory { - - public Coffee createCoffee(String type) { - //声明Coffee类型的变量,根据不同类型创建不同的coffee子类对象 - Coffee coffee = null; - if("american".equals(type)) { - coffee = new AmericanCoffee(); - } else if("latte".equals(type)) { - coffee = new LatteCoffee(); - } else { - throw new RuntimeException("对不起,您所点的咖啡没有"); - } - - return coffee; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/AmericanCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/static_factory/AmericanCoffee.java deleted file mode 100644 index 46d20368..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/AmericanCoffee.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.factory.static_factory; - -/* - 美式咖啡 - */ -public class AmericanCoffee extends Coffee { - - public String getName() { - return "美式咖啡"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/Client.java b/src/main/java/com/fangpeng/design/pattern/factory/static_factory/Client.java deleted file mode 100644 index f2eb10c4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/Client.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.factory.static_factory; - -public class Client { - - public static void main(String[] args) { - //1,创建咖啡店类 - CoffeeStore store = new CoffeeStore(); - //2,点咖啡 - Coffee coffee = store.orderCoffee("american"); - - System.out.println(coffee.getName()); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/Coffee.java b/src/main/java/com/fangpeng/design/pattern/factory/static_factory/Coffee.java deleted file mode 100644 index 2c2cade3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/Coffee.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.factory.static_factory; - -/* - 咖啡类 - */ -public abstract class Coffee { - - public abstract String getName(); - - //加糖 - public void addSugar() { - System.out.println("加糖"); - } - - //加奶 - public void addMilk() { - System.out.println("加奶"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/CoffeeStore.java b/src/main/java/com/fangpeng/design/pattern/factory/static_factory/CoffeeStore.java deleted file mode 100644 index d60e5188..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/CoffeeStore.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.pattern.factory.static_factory; - -public class CoffeeStore { - - public Coffee orderCoffee(String type) { - - //调用生产咖啡的方法 - Coffee coffee = SimpleCoffeeFactory.createCoffee(type); - - //加配料 - coffee.addMilk(); - coffee.addSugar(); - - return coffee; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/LatteCoffee.java b/src/main/java/com/fangpeng/design/pattern/factory/static_factory/LatteCoffee.java deleted file mode 100644 index 69dff436..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/LatteCoffee.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.factory.static_factory; - -/* - 拿铁咖啡 - */ -public class LatteCoffee extends Coffee { - - public String getName() { - return "拿铁咖啡"; - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/SimpleCoffeeFactory.java b/src/main/java/com/fangpeng/design/pattern/factory/static_factory/SimpleCoffeeFactory.java deleted file mode 100644 index 75215686..00000000 --- a/src/main/java/com/fangpeng/design/pattern/factory/static_factory/SimpleCoffeeFactory.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.factory.static_factory; - -/* - 简单咖啡工厂类,用来生产咖啡 - */ -public class SimpleCoffeeFactory { - - public static Coffee createCoffee(String type) { - //声明Coffee类型的变量,根据不同类型创建不同的coffee子类对象 - Coffee coffee = null; - if("american".equals(type)) { - coffee = new AmericanCoffee(); - } else if("latte".equals(type)) { - coffee = new LatteCoffee(); - } else { - throw new RuntimeException("对不起,您所点的咖啡没有"); - } - - return coffee; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/flyweight/AbstractBox.java b/src/main/java/com/fangpeng/design/pattern/flyweight/AbstractBox.java deleted file mode 100644 index 4019d14e..00000000 --- a/src/main/java/com/fangpeng/design/pattern/flyweight/AbstractBox.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.flyweight; - -/** - * 抽象享元角色 - * @author 方鹏 - * @date 2022年02月08日 2:37 下午 - */ -public abstract class AbstractBox { - - //获取图形的方法 - public abstract String getShape(); - - //显示图形及颜色 - public void display(String color) { - System.out.println("方块形状:" + getShape() + ", 颜色:" + color); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/flyweight/BoxFactory.java b/src/main/java/com/fangpeng/design/pattern/flyweight/BoxFactory.java deleted file mode 100644 index 78f7bb94..00000000 --- a/src/main/java/com/fangpeng/design/pattern/flyweight/BoxFactory.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.fangpeng.design.pattern.flyweight; - -import java.util.HashMap; -import java.util.Map; - -/** - * 工厂类,将该类设计为单例 - * @author 方鹏 - * @date 2022年02月08日 2:39 下午 - */ -public class BoxFactory { - - private Map map; - - //在构造方法中进行初始化操作 - private BoxFactory() { - map = new HashMap<>(); - map.put("I", new IBox()); - map.put("L", new LBox()); - map.put("O", new OBox()); - } - - private static BoxFactory factory = new BoxFactory(); - - //提供一个方法获取该工厂类对象 - public static BoxFactory getInstance() { - return factory; - } - - //根据名称获取图形对象 - public AbstractBox getShape(String name) { - return map.get(name); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/flyweight/Client.java b/src/main/java/com/fangpeng/design/pattern/flyweight/Client.java deleted file mode 100644 index bf8369e6..00000000 --- a/src/main/java/com/fangpeng/design/pattern/flyweight/Client.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.fangpeng.design.pattern.flyweight; - -/** - * @author 方鹏 - * @date 2022年02月08日 2:42 下午 - */ -public class Client { - - public static void main(String[] args) { - //获取I图形对象 - AbstractBox box1 = BoxFactory.getInstance().getShape("I"); - box1.display("灰色"); - - //获取L图形对象 - AbstractBox box2 = BoxFactory.getInstance().getShape("L"); - box2.display("绿色"); - - //获取O图形对象 - AbstractBox box3 = BoxFactory.getInstance().getShape("O"); - box3.display("灰色"); - - //获取O图形对象 - AbstractBox box4 = BoxFactory.getInstance().getShape("O"); - box4.display("红色"); - - System.out.println("两次获取到的O图形对象是否是同一个对象:" + (box3 == box4)); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/flyweight/IBox.java b/src/main/java/com/fangpeng/design/pattern/flyweight/IBox.java deleted file mode 100644 index d69bffc7..00000000 --- a/src/main/java/com/fangpeng/design/pattern/flyweight/IBox.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.flyweight; - -/** - * I图形类(具体享元角色) - * @author 方鹏 - * @date 2022年02月08日 2:38 下午 - */ -public class IBox extends AbstractBox { - - @Override - public String getShape() { - return "I"; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/flyweight/LBox.java b/src/main/java/com/fangpeng/design/pattern/flyweight/LBox.java deleted file mode 100644 index 58023ea5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/flyweight/LBox.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.flyweight; - -/** - * L图形类(具体享元角色) - * @author 方鹏 - * @date 2022年02月08日 2:38 下午 - */ -public class LBox extends AbstractBox { - - @Override - public String getShape() { - return "L"; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/flyweight/OBox.java b/src/main/java/com/fangpeng/design/pattern/flyweight/OBox.java deleted file mode 100644 index 8de72af4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/flyweight/OBox.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.flyweight; - -/** - * O图形类(具体享元角色) - * @author 方鹏 - * @date 2022年02月08日 2:39 下午 - */ -public class OBox extends AbstractBox { - - @Override - public String getShape() { - return "O"; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/interpreter/AbstractExpression.java b/src/main/java/com/fangpeng/design/pattern/interpreter/AbstractExpression.java deleted file mode 100644 index a989125a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/interpreter/AbstractExpression.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.interpreter; - -/** - * 抽象表达式类 - * @author 方鹏 - * @date 2022年02月09日 6:49 下午 - */ -public abstract class AbstractExpression { - - public abstract int interpret(Context context); -} diff --git a/src/main/java/com/fangpeng/design/pattern/interpreter/Client.java b/src/main/java/com/fangpeng/design/pattern/interpreter/Client.java deleted file mode 100644 index 920ff752..00000000 --- a/src/main/java/com/fangpeng/design/pattern/interpreter/Client.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.fangpeng.design.pattern.interpreter; - -/** - * @author 方鹏 - * @date 2022年02月09日 9:45 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建环境对象 - Context context = new Context(); - - //创建多个变量对象 - Variable a = new Variable("a"); - Variable b = new Variable("b"); - Variable c = new Variable("c"); - Variable d = new Variable("d"); - - //将变量存储到环境对象中 - context.assign(a,1); - context.assign(b,2); - context.assign(c,3); - context.assign(d,4); - - //获取抽象语法树 a + b - c + d - AbstractExpression expression = new Minus(a,new Minus(new Minus(b,c),d)); - - //解释(计算) - int result = expression.interpret(context); - - System.out.println(expression + " = " + result); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/interpreter/Context.java b/src/main/java/com/fangpeng/design/pattern/interpreter/Context.java deleted file mode 100644 index 130c4e0a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/interpreter/Context.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.pattern.interpreter; - -import java.util.HashMap; -import java.util.Map; - -/** - * 环境角色类 - * @author 方鹏 - * @date 2022年02月09日 6:49 下午 - */ -public class Context { - - //定义一个map集合,用来存储变量及对应的值 - private Map map = new HashMap(); - - //添加变量的功能 - public void assign(Variable var, Integer value) { - map.put(var,value); - } - - //根据变量获取对应的值 - public int getValue(Variable var) { - return map.get(var); - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/interpreter/Minus.java b/src/main/java/com/fangpeng/design/pattern/interpreter/Minus.java deleted file mode 100644 index 3a21dbc2..00000000 --- a/src/main/java/com/fangpeng/design/pattern/interpreter/Minus.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.interpreter; - -/** - * 减法表达式类 - * @author 方鹏 - * @date 2022年02月09日 9:26 下午 - */ -public class Minus extends AbstractExpression { - - //-号左边的表达式 - private AbstractExpression left; - //-号右边的表达式 - private AbstractExpression right; - - public Minus(AbstractExpression left, AbstractExpression right) { - this.left = left; - this.right = right; - } - - @Override - public int interpret(Context context) { - //将左边表达式的结果和右边表达式的结果进行相减 - return left.interpret(context) - right.interpret(context); - } - - @Override - public String toString() { - return "(" + left.toString() + " - " + right.toString() + ")"; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/interpreter/Plus.java b/src/main/java/com/fangpeng/design/pattern/interpreter/Plus.java deleted file mode 100644 index 4f80f9ba..00000000 --- a/src/main/java/com/fangpeng/design/pattern/interpreter/Plus.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.interpreter; - -/** - * 加法表达式类 - * @author 方鹏 - * @date 2022年02月09日 9:26 下午 - */ -public class Plus extends AbstractExpression { - - //+号左边的表达式 - private AbstractExpression left; - //+号右边的表达式 - private AbstractExpression right; - - public Plus(AbstractExpression left, AbstractExpression right) { - this.left = left; - this.right = right; - } - - @Override - public int interpret(Context context) { - //将左边表达式的结果和右边表达式的结果进行相加 - return left.interpret(context) + right.interpret(context); - } - - @Override - public String toString() { - return "(" + left.toString() + " + " + right.toString() + ")"; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/interpreter/Variable.java b/src/main/java/com/fangpeng/design/pattern/interpreter/Variable.java deleted file mode 100644 index 3d56211c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/interpreter/Variable.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.design.pattern.interpreter; - -/** - * 封装变量的类 - * @author 方鹏 - * @date 2022年02月09日 9:27 下午 - */ -public class Variable extends AbstractExpression { - - //声明存储变量名的成员变量 - private String name; - - public Variable(String name) { - this.name = name; - } - - @Override - public int interpret(Context context) { - //直接返回变量的值 - return context.getValue(this); - } - - @Override - public String toString() { - return name; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/iterator/Client.java b/src/main/java/com/fangpeng/design/pattern/iterator/Client.java deleted file mode 100644 index 42283dac..00000000 --- a/src/main/java/com/fangpeng/design/pattern/iterator/Client.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.iterator; - -/** - * @author 方鹏 - * @date 2022年02月08日 8:54 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建聚合对象 - StudentAggregateImpl aggregate = new StudentAggregateImpl(); - //添加元素 - aggregate.addStudent(new Student("张三","001")); - aggregate.addStudent(new Student("李四","002")); - aggregate.addStudent(new Student("王五","003")); - aggregate.addStudent(new Student("赵六","004")); - - //遍历聚合对象 - - //1,获取迭代器对象 - StudentIterator iterator = aggregate.getStudentIterator(); - //2,遍历 - while(iterator.hasNext()) { - //3,获取元素 - Student student = iterator.next(); - System.out.println(student.toString()); - } - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/iterator/Student.java b/src/main/java/com/fangpeng/design/pattern/iterator/Student.java deleted file mode 100644 index a6d2b3f9..00000000 --- a/src/main/java/com/fangpeng/design/pattern/iterator/Student.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.fangpeng.design.pattern.iterator; - -/** - * @author 方鹏 - * @date 2022年02月08日 8:49 下午 - */ -public class Student { - - private String name; - private String number; - - @Override - public String toString() { - return "Student{" + - "name='" + name + '\'' + - ", number='" + number + '\'' + - '}'; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getNumber() { - return number; - } - - public void setNumber(String number) { - this.number = number; - } - - public Student(String name, String number) { - this.name = name; - this.number = number; - } - - public Student() { - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/iterator/StudentAggregate.java b/src/main/java/com/fangpeng/design/pattern/iterator/StudentAggregate.java deleted file mode 100644 index ceac4047..00000000 --- a/src/main/java/com/fangpeng/design/pattern/iterator/StudentAggregate.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.iterator; - -/* - * 抽象聚合角色接口 - * @author 方鹏 - * @date 2022/2/8 8:52 下午 - */ -public interface StudentAggregate { - - //添加学生功能 - void addStudent(Student stu); - - //删除学生功能 - void removeStudent(Student stu); - - //获取迭代器对象功能 - StudentIterator getStudentIterator(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/iterator/StudentAggregateImpl.java b/src/main/java/com/fangpeng/design/pattern/iterator/StudentAggregateImpl.java deleted file mode 100644 index 2b552d67..00000000 --- a/src/main/java/com/fangpeng/design/pattern/iterator/StudentAggregateImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.fangpeng.design.pattern.iterator; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author 方鹏 - * @date 2022年02月08日 8:52 下午 - */ -public class StudentAggregateImpl implements StudentAggregate { - - private List list = new ArrayList(); - - @Override - public void addStudent(Student stu) { - list.add(stu); - } - - @Override - public void removeStudent(Student stu) { - list.remove(stu); - } - - @Override - public StudentIterator getStudentIterator() { - return new StudentIteratorImpl(list); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/iterator/StudentIterator.java b/src/main/java/com/fangpeng/design/pattern/iterator/StudentIterator.java deleted file mode 100644 index ef4054f1..00000000 --- a/src/main/java/com/fangpeng/design/pattern/iterator/StudentIterator.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.iterator; - -/* - * 抽象迭代器角色接口 - * @author 方鹏 - * @date 2022/2/8 8:49 下午 -*/ -public interface StudentIterator { - - //判断是否还有元素 - boolean hasNext(); - - //获取下一个元素 - Student next(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/iterator/StudentIteratorImpl.java b/src/main/java/com/fangpeng/design/pattern/iterator/StudentIteratorImpl.java deleted file mode 100644 index 44bbb354..00000000 --- a/src/main/java/com/fangpeng/design/pattern/iterator/StudentIteratorImpl.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fangpeng.design.pattern.iterator; - -import java.util.List; - -/** - * 具体迭代器角色类 - * @author 方鹏 - * @date 2022年02月08日 8:50 下午 - */ -public class StudentIteratorImpl implements StudentIterator { - - private List list; - private int position = 0;//用来记录遍历时的位置 - - public StudentIteratorImpl(List list) { - this.list = list; - } - - @Override - public boolean hasNext() { - return position < list.size(); - } - - @Override - public Student next() { - //从集合中获取指定位置的元素 - Student currentStudent = list.get(position); - position++; - return currentStudent; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/mediator/Client.java b/src/main/java/com/fangpeng/design/pattern/mediator/Client.java deleted file mode 100644 index ff1ad405..00000000 --- a/src/main/java/com/fangpeng/design/pattern/mediator/Client.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.pattern.mediator; - -/** - * @author 方鹏 - * @date 2022年02月08日 8:36 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建中介者对象 - MediatorStructure mediator = new MediatorStructure(); - - //创建租房者对象 - Tenant tenant = new Tenant("李四", mediator); - //创建房主对象 - HouseOwner houseOwner = new HouseOwner("张三", mediator); - - //中介者要知道具体的房主和租房者 - mediator.setTenant(tenant); - mediator.setHouseOwner(houseOwner); - - tenant.constact("我要租三室的房子!!!"); - houseOwner.constact("我这里有三室的房子,你要租吗?"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/mediator/HouseOwner.java b/src/main/java/com/fangpeng/design/pattern/mediator/HouseOwner.java deleted file mode 100644 index 843f8fa5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/mediator/HouseOwner.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.mediator; - -/** - * 具体的同事角色类 - * @author 方鹏 - * @date 2022年02月08日 8:29 下午 - */ -public class HouseOwner extends Person { - - public HouseOwner(String name, Mediator mediator) { - super(name, mediator); - } - - //和中介联系(沟通) - public void constact(String message) { - mediator.constact(message,this); - } - - //获取信息 - public void getMessage(String message) { - System.out.println("房主" + name + "获取到的信息是:" + message); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/mediator/Mediator.java b/src/main/java/com/fangpeng/design/pattern/mediator/Mediator.java deleted file mode 100644 index f9f87535..00000000 --- a/src/main/java/com/fangpeng/design/pattern/mediator/Mediator.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.mediator; - -/** - * 抽象中介者类 - * @author 方鹏 - * @date 2022年02月08日 8:27 下午 - */ -public abstract class Mediator { - - public abstract void constact(String message, Person person); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/mediator/MediatorStructure.java b/src/main/java/com/fangpeng/design/pattern/mediator/MediatorStructure.java deleted file mode 100644 index d80aa0ef..00000000 --- a/src/main/java/com/fangpeng/design/pattern/mediator/MediatorStructure.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fangpeng.design.pattern.mediator; - -/** - * 具体的中介者角色类 - * @author 方鹏 - * @date 2022年02月08日 8:31 下午 - */ -public class MediatorStructure extends Mediator { - - //聚合房主和租房者对象 - private HouseOwner houseOwner; - private Tenant tenant; - - public HouseOwner getHouseOwner() { - return houseOwner; - } - - public void setHouseOwner(HouseOwner houseOwner) { - this.houseOwner = houseOwner; - } - - public Tenant getTenant() { - return tenant; - } - - public void setTenant(Tenant tenant) { - this.tenant = tenant; - } - - @Override - public void constact(String message, Person person) { - if(person == houseOwner) { - tenant.getMessage(message); - } else { - houseOwner.getMessage(message); - } - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/mediator/Person.java b/src/main/java/com/fangpeng/design/pattern/mediator/Person.java deleted file mode 100644 index 32850896..00000000 --- a/src/main/java/com/fangpeng/design/pattern/mediator/Person.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.pattern.mediator; - -/** - * 抽象同事类 - * @author 方鹏 - * @date 2022年02月08日 8:28 下午 - */ -public abstract class Person { - - protected String name; - protected Mediator mediator; - - public Person(String name, Mediator mediator) { - this.name = name; - this.mediator = mediator; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/mediator/Tenant.java b/src/main/java/com/fangpeng/design/pattern/mediator/Tenant.java deleted file mode 100644 index bcaa3d46..00000000 --- a/src/main/java/com/fangpeng/design/pattern/mediator/Tenant.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.mediator; - -/** - * 具体的同事角色类 - * @author 方鹏 - * @date 2022年02月08日 8:30 下午 - */ -public class Tenant extends Person { - public Tenant(String name, Mediator mediator) { - super(name, mediator); - } - - //和中介联系(沟通) - public void constact(String message) { - mediator.constact(message,this); - } - - //获取信息 - public void getMessage(String message) { - System.out.println("租房者" + name + "获取到的信息是:" + message); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/black_box/Client.java b/src/main/java/com/fangpeng/design/pattern/memento/black_box/Client.java deleted file mode 100644 index dadf4457..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/black_box/Client.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.fangpeng.design.pattern.memento.black_box; - -/** - * @author 方鹏 - * @date 2022年02月09日 6:26 下午 - */ -public class Client { - public static void main(String[] args) { - System.out.println("---------------大战boos前-----------------"); - //创建游戏角色对象 - GameRole gameRole = new GameRole(); - gameRole.initState();//初始化状态操作 - gameRole.stateDisplay(); - - //将该游戏角色内部状态进行备份 - //创建管理者对象 - RoleStateCaretaker roleStateCaretaker = new RoleStateCaretaker(); - roleStateCaretaker.setMemento(gameRole.saveState()); - - System.out.println("---------------大战boos后-----------------"); - //损耗严重 - gameRole.fight(); - gameRole.stateDisplay(); - - System.out.println("---------------恢复之前的状态-----------------"); - gameRole.recoverState(roleStateCaretaker.getMemento()); - gameRole.stateDisplay(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/black_box/GameRole.java b/src/main/java/com/fangpeng/design/pattern/memento/black_box/GameRole.java deleted file mode 100644 index bf7880bc..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/black_box/GameRole.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.fangpeng.design.pattern.memento.black_box; - -/** - * 游戏角色类(属于发起人角色) - * @author 方鹏 - * @date 2022年02月09日 6:25 下午 - */ -public class GameRole { - - private int vit; //生命力 - private int atk; //攻击力 - private int def; //防御力 - - //初始化内部状态 - public void initState() { - this.vit = 100; - this.atk = 100; - this.def = 100; - } - - //战斗 - public void fight() { - this.vit = 0; - this.atk = 0; - this.def = 0; - } - - //保存角色状态功能 - public Memento saveState() { - return new RoleStateMemento(vit,atk,def); - } - - //恢复角色状态 - public void recoverState(Memento memento) { - RoleStateMemento roleStateMemento = (RoleStateMemento) memento; - //将备忘录对象中存储的状态赋值给当前对象的成员 - this.vit = roleStateMemento.getVit(); - this.atk = roleStateMemento.getAtk(); - this.def = roleStateMemento.getDef(); - } - - //展示状态功能 - public void stateDisplay() { - System.out.println("角色生命力:" + vit); - System.out.println("角色攻击力:" + atk); - System.out.println("角色防御力:" + def); - } - - public int getVit() { - return vit; - } - - public void setVit(int vit) { - this.vit = vit; - } - - public int getAtk() { - return atk; - } - - public void setAtk(int atk) { - this.atk = atk; - } - - public int getDef() { - return def; - } - - public void setDef(int def) { - this.def = def; - } - - private class RoleStateMemento implements Memento { - private int vit; //生命力 - private int atk; //攻击力 - private int def; //防御力 - - public RoleStateMemento(int vit, int atk, int def) { - this.vit = vit; - this.atk = atk; - this.def = def; - } - - public RoleStateMemento() { - } - - public int getVit() { - return vit; - } - - public void setVit(int vit) { - this.vit = vit; - } - - public int getAtk() { - return atk; - } - - public void setAtk(int atk) { - this.atk = atk; - } - - public int getDef() { - return def; - } - - public void setDef(int def) { - this.def = def; - } - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/black_box/Memento.java b/src/main/java/com/fangpeng/design/pattern/memento/black_box/Memento.java deleted file mode 100644 index 49890cb4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/black_box/Memento.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.fangpeng.design.pattern.memento.black_box; - -/* - * 备忘录接口,对外提供窄接口 - * @author 方鹏 - * @date 2022/2/9 6:25 下午 - */ -public interface Memento { -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/black_box/RoleStateCaretaker.java b/src/main/java/com/fangpeng/design/pattern/memento/black_box/RoleStateCaretaker.java deleted file mode 100644 index 2a8d886d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/black_box/RoleStateCaretaker.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.memento.black_box; - -/** - * 备忘录对象管理对象 - * @author 方鹏 - * @date 2022年02月09日 6:25 下午 - */ -public class RoleStateCaretaker { - - //声明RoleStateMemento类型的变量 - private Memento memento; - - public Memento getMemento() { - return memento; - } - - public void setMemento(Memento memento) { - this.memento = memento; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/white_box/Client.java b/src/main/java/com/fangpeng/design/pattern/memento/white_box/Client.java deleted file mode 100644 index b9be516e..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/white_box/Client.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fangpeng.design.pattern.memento.white_box; - -/** - * @author 方鹏 - * @date 2022年02月09日 5:23 下午 - */ -public class Client { - - public static void main(String[] args) { - System.out.println("---------------大战boos前-----------------"); - //创建游戏角色对象 - GameRole gameRole = new GameRole(); - gameRole.initState();//初始化状态操作 - gameRole.stateDisplay(); - - //将该游戏角色内部状态进行备份 - //创建管理者对象 - RoleStateCaretaker roleStateCaretaker = new RoleStateCaretaker(); - roleStateCaretaker.setRoleStateMemento(gameRole.saveState()); - - System.out.println("---------------大战boos后-----------------"); - //损耗严重 - gameRole.fight(); - gameRole.stateDisplay(); - - System.out.println("---------------恢复之前的状态-----------------"); - gameRole.recoverState(roleStateCaretaker.getRoleStateMemento()); - gameRole.stateDisplay(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/white_box/GameRole.java b/src/main/java/com/fangpeng/design/pattern/memento/white_box/GameRole.java deleted file mode 100644 index 8a96caa5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/white_box/GameRole.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.fangpeng.design.pattern.memento.white_box; - -/** - * 游戏角色类(属于发起人角色) - * @author 方鹏 - * @date 2022年02月09日 5:32 下午 - */ -public class GameRole { - - private int vit; //生命力 - private int atk; //攻击力 - private int def; //防御力 - - //初始化内部状态 - public void initState() { - this.vit = 100; - this.atk = 100; - this.def = 100; - } - - //战斗 - public void fight() { - this.vit = 0; - this.atk = 0; - this.def = 0; - } - - //保存角色状态功能 - public RoleStateMemento saveState() { - return new RoleStateMemento(vit,atk,def); - } - - //恢复角色状态 - public void recoverState(RoleStateMemento roleStateMemento) { - //将备忘录对象中存储的状态赋值给当前对象的成员 - this.vit = roleStateMemento.getVit(); - this.atk = roleStateMemento.getAtk(); - this.def = roleStateMemento.getDef(); - } - - //展示状态功能 - public void stateDisplay() { - System.out.println("角色生命力:" + vit); - System.out.println("角色攻击力:" + atk); - System.out.println("角色防御力:" + def); - } - - public int getVit() { - return vit; - } - - public void setVit(int vit) { - this.vit = vit; - } - - public int getAtk() { - return atk; - } - - public void setAtk(int atk) { - this.atk = atk; - } - - public int getDef() { - return def; - } - - public void setDef(int def) { - this.def = def; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/white_box/RoleStateCaretaker.java b/src/main/java/com/fangpeng/design/pattern/memento/white_box/RoleStateCaretaker.java deleted file mode 100644 index 53922cd1..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/white_box/RoleStateCaretaker.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.memento.white_box; - -/** - * 备忘录对象管理对象 - * @author 方鹏 - * @date 2022年02月09日 5:35 下午 - */ -public class RoleStateCaretaker { - - //声明RoleStateMemento类型的变量 - private RoleStateMemento roleStateMemento; - - public RoleStateMemento getRoleStateMemento() { - return roleStateMemento; - } - - public void setRoleStateMemento(RoleStateMemento roleStateMemento) { - this.roleStateMemento = roleStateMemento; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/memento/white_box/RoleStateMemento.java b/src/main/java/com/fangpeng/design/pattern/memento/white_box/RoleStateMemento.java deleted file mode 100644 index 643b83a3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/memento/white_box/RoleStateMemento.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.fangpeng.design.pattern.memento.white_box; - -/** - * 备忘录角色类 - * @author 方鹏 - * @date 2022年02月09日 5:42 下午 - */ -public class RoleStateMemento { - - private int vit; //生命力 - private int atk; //攻击力 - private int def; //防御力 - - public RoleStateMemento(int vit, int atk, int def) { - this.vit = vit; - this.atk = atk; - this.def = def; - } - - public RoleStateMemento() { - } - - public int getVit() { - return vit; - } - - public void setVit(int vit) { - this.vit = vit; - } - - public int getAtk() { - return atk; - } - - public void setAtk(int atk) { - this.atk = atk; - } - - public int getDef() { - return def; - } - - public void setDef(int def) { - this.def = def; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/observer/Client.java b/src/main/java/com/fangpeng/design/pattern/observer/Client.java deleted file mode 100644 index 684a76ee..00000000 --- a/src/main/java/com/fangpeng/design/pattern/observer/Client.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.observer; - -/** - * @author 方鹏 - * @date 2022年02月08日 6:31 下午 - */ -public class Client { - - public static void main(String[] args) { - //1,创建公众号对象 - SubscriptionSubject subject = new SubscriptionSubject(); - - //2,订阅公众号 - subject.attach(new WeiXinUser("孙悟空")); - subject.attach(new WeiXinUser("猪悟能")); - subject.attach(new WeiXinUser("沙悟净")); - - //3,公众号更新,发出消息给订阅者(观察者对象) - subject.notify("程序猿的专栏更新了!"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/observer/Observer.java b/src/main/java/com/fangpeng/design/pattern/observer/Observer.java deleted file mode 100644 index fb643116..00000000 --- a/src/main/java/com/fangpeng/design/pattern/observer/Observer.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.observer; - -/** - * 抽象观察者类 - * @author 方鹏 - * @date 2022年02月08日 6:27 下午 - */ -public interface Observer { - - void update(String message); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/observer/Subject.java b/src/main/java/com/fangpeng/design/pattern/observer/Subject.java deleted file mode 100644 index f6ed7b60..00000000 --- a/src/main/java/com/fangpeng/design/pattern/observer/Subject.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.observer; - -/* - * 抽象主题角色类 - * @author 方鹏 - * @date 2022/2/8 6:26 下午 - */ -public interface Subject { - - //添加订阅者(添加观察者对象) - void attach(Observer observer); - - //删除订阅者 - void detach(Observer observer); - - //通知订阅者更新消息 - void notify(String message); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/observer/SubscriptionSubject.java b/src/main/java/com/fangpeng/design/pattern/observer/SubscriptionSubject.java deleted file mode 100644 index dca6e7d5..00000000 --- a/src/main/java/com/fangpeng/design/pattern/observer/SubscriptionSubject.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.fangpeng.design.pattern.observer; - -import java.util.ArrayList; -import java.util.List; - -/** - * 具体主题角色类 - * @author 方鹏 - * @date 2022年02月08日 6:27 下午 - */ -public class SubscriptionSubject implements Subject { - - //定义一个集合,用来存储多个观察者对象 - private List weixinUserList = new ArrayList<>(); - - @Override - public void attach(Observer observer) { - weixinUserList.add(observer); - } - - @Override - public void detach(Observer observer) { - weixinUserList.remove(observer); - } - - @Override - public void notify(String message) { - //遍历集合 - for (Observer observer : weixinUserList) { - //调用观察者对象中的update方法 - observer.update(message); - } - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/observer/WeiXinUser.java b/src/main/java/com/fangpeng/design/pattern/observer/WeiXinUser.java deleted file mode 100644 index e8ad24e7..00000000 --- a/src/main/java/com/fangpeng/design/pattern/observer/WeiXinUser.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.observer; - -/** - * 具体的观察者角色类 - * @author 方鹏 - * @date 2022年02月08日 6:29 下午 - */ -public class WeiXinUser implements Observer { - - private String name; - - public WeiXinUser(String name) { - this.name = name; - } - - @Override - public void update(String message) { - System.out.println(name + "-" + message); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/demo/Realizetype.java b/src/main/java/com/fangpeng/design/pattern/prototype/demo/Realizetype.java deleted file mode 100644 index 35dd74f8..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/demo/Realizetype.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.prototype.demo; - -import java.io.Closeable; -import java.io.IOException; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:44 下午 - */ -public class Realizetype implements Cloneable { - - public Realizetype() { - System.out.println("具体的原型对象创建完成!"); - } - - @Override - protected Realizetype clone() throws CloneNotSupportedException { - System.out.println("具体原型复制成功!"); - - return (Realizetype) super.clone(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/demo/client.java b/src/main/java/com/fangpeng/design/pattern/prototype/demo/client.java deleted file mode 100644 index 2d238e62..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/demo/client.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.prototype.demo; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:46 下午 - */ -public class client { - - public static void main(String[] args) throws CloneNotSupportedException { - //创建一个原型类对象 - Realizetype realizetype = new Realizetype(); - - //调用Realizetype类中的clone方法进行对象的克隆 - Realizetype clone = realizetype.clone(); - - System.out.println("原型对象和克隆出来的是否是同一个对象?" + (realizetype == clone)); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/test/CitaionTest.java b/src/main/java/com/fangpeng/design/pattern/prototype/test/CitaionTest.java deleted file mode 100644 index fcdc0911..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/test/CitaionTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.prototype.test; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:54 下午 - */ -public class CitaionTest { - - public static void main(String[] args) throws CloneNotSupportedException { - //1,创建原型对象 - Citation citation = new Citation(); - //创建张三学生对象 - Student stu = new Student(); - stu.setName("张三"); - citation.setStu(stu); - - //2,克隆奖状对象 - Citation citation1 = citation.clone(); - Student stu1 = citation1.getStu(); - stu1.setName("李四"); - - /*citation.setName("张三"); - citation1.setName("李四");*/ - - //3,调用show方法展示 - citation.show(); - citation1.show(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/test/Citation.java b/src/main/java/com/fangpeng/design/pattern/prototype/test/Citation.java deleted file mode 100644 index f620ee5c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/test/Citation.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fangpeng.design.pattern.prototype.test; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:52 下午 - */ -public class Citation implements Cloneable{ - - //三好学生上的姓名 - //private String name; - // - //public String getName() { - // return name; - //} - // - //public void setName(String name) { - // this.name = name; - //} - - private Student stu; - - public Student getStu() { - return stu; - } - - public void setStu(Student stu) { - this.stu = stu; - } - - @Override - public Citation clone() throws CloneNotSupportedException { - return (Citation) super.clone(); - } - - public void show() { - System.out.println(stu.getName() + "同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状!"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/test/Student.java b/src/main/java/com/fangpeng/design/pattern/prototype/test/Student.java deleted file mode 100644 index f494b2af..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/test/Student.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.design.pattern.prototype.test; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:58 下午 - */ -public class Student { - - //学生的姓名 - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return "Student{" + - "name='" + name + '\'' + - '}'; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/test1/CitaionTest.java b/src/main/java/com/fangpeng/design/pattern/prototype/test1/CitaionTest.java deleted file mode 100644 index 83fd435c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/test1/CitaionTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.fangpeng.design.pattern.prototype.test1; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:54 下午 - */ -public class CitaionTest { - - public static void main(String[] args) throws Exception { - //1,创建原型对象 - Citation citation = new Citation(); - //创建张三学生对象 - Student stu = new Student(); - stu.setName("张三"); - citation.setStu(stu); - - //创建对象输出流对象 - ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/robin/a.txt")); - //写对象 - oos.writeObject(citation); - //释放资源 - oos.close(); - - //创建对象输入流对象 - ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/robin/a.txt")); - //读取对象 - Citation citation1 = (Citation) ois.readObject(); - //释放资源 - ois.close(); - Student stu1 = citation1.getStu(); - stu1.setName("李四"); - - citation.show(); - citation1.show(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/test1/Citation.java b/src/main/java/com/fangpeng/design/pattern/prototype/test1/Citation.java deleted file mode 100644 index 3fde0c6f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/test1/Citation.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.design.pattern.prototype.test1; - -import java.io.Serializable; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:52 下午 - */ -public class Citation implements Cloneable, Serializable { - - //三好学生上的姓名 - //private String name; - // - //public String getName() { - // return name; - //} - // - //public void setName(String name) { - // this.name = name; - //} - - private Student stu; - - public Student getStu() { - return stu; - } - - public void setStu(Student stu) { - this.stu = stu; - } - - @Override - public Citation clone() throws CloneNotSupportedException { - return (Citation) super.clone(); - } - - public void show() { - System.out.println(stu.getName() + "同学:在2020学年第一学期中表现优秀,被评为三好学生。特发此状!"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/prototype/test1/Student.java b/src/main/java/com/fangpeng/design/pattern/prototype/test1/Student.java deleted file mode 100644 index be56d6fe..00000000 --- a/src/main/java/com/fangpeng/design/pattern/prototype/test1/Student.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.fangpeng.design.pattern.prototype.test1; - -import java.io.Serializable; - -/** - * @author 方鹏 - * @date 2022年02月07日 1:58 下午 - */ -public class Student implements Serializable { - - //学生的姓名 - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return "Student{" + - "name='" + name + '\'' + - '}'; - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/Client.java b/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/Client.java deleted file mode 100644 index fb8ec17f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/Client.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.proxy.cglib_proxy; - -/** - * @author 方鹏 - * @date 2022年02月07日 6:54 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建代理工厂对象 - ProxyFactory factory = new ProxyFactory(); - //获取代理对象 - TrainStation proxyObject = factory.getProxyObject(); - //调用代理对象中的sell方法卖票 - proxyObject.sell(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/ProxyFactory.java b/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/ProxyFactory.java deleted file mode 100644 index feb207ad..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/ProxyFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.design.pattern.proxy.cglib_proxy; - -import net.sf.cglib.proxy.Enhancer; -import net.sf.cglib.proxy.MethodInterceptor; -import net.sf.cglib.proxy.MethodProxy; - -import java.lang.reflect.Method; - -/** - * 代理对象工厂,用来获取代理对象 - * @author 方鹏 - * @date 2022年02月07日 6:48 下午 - */ -public class ProxyFactory implements MethodInterceptor { - - //声明火车站对象 - private TrainStation station = new TrainStation(); - - public TrainStation getProxyObject() { - //创建Enhancer对象,类似于JDK代理中的Proxy类 - Enhancer enhancer = new Enhancer(); - //设置父类的字节码对象。指定父类 - enhancer.setSuperclass(TrainStation.class); - //设置回调函数 - enhancer.setCallback(this); - //创建代理对象 - TrainStation proxyObject = (TrainStation) enhancer.create(); - return proxyObject; - } - - @Override - public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { - //System.out.println("方法执行了"); - System.out.println("代售点收取一定的服务费用(CGLib代理)"); - //要调用目标对象的方法 - Object obj = method.invoke(station, objects); - return obj; - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/TrainStation.java b/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/TrainStation.java deleted file mode 100644 index 08d7b067..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/cglib_proxy/TrainStation.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.proxy.cglib_proxy; - - -/** - * 火车站类 - * @author 方鹏 - * @date 2022年02月07日 6:11 下午 - */ -public class TrainStation{ - - public void sell() { - System.out.println("火车站卖票"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/Client.java b/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/Client.java deleted file mode 100644 index 5f62d7eb..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/Client.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.proxy.jdk_proxy; - -/** - * @author 方鹏 - * @date 2022年02月07日 6:26 下午 - */ -public class Client { - public static void main(String[] args) { - //获取代理对象 - //1,创建代理工厂对象 - ProxyFactory factory = new ProxyFactory(); - //2,使用factory对象的方法获取代理对象 - SellTickets proxyObject = factory.getProxyObject(); - //3,调用卖调用的方法 - proxyObject.sell(); - - System.out.println(proxyObject.getClass()); - - //让程序一直执行 - while(true) {} - - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/ProxyFactory.java b/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/ProxyFactory.java deleted file mode 100644 index 53ba8dab..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/ProxyFactory.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.fangpeng.design.pattern.proxy.jdk_proxy; - - -import com.fangpeng.design.pattern.proxy.cglib_proxy.TrainStation; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -/** - * 获取代理对象的工厂类:代理类也实现了对应的接口 - * @author 方鹏 - * @date 2022年02月07日 6:19 下午 - */ -public class ProxyFactory { - - //声明目标对象 - private TrainStation station = new TrainStation(); - - //获取代理对象的方法 - public SellTickets getProxyObject() { - //返回代理对象 - /* - ClassLoader loader : 类加载器,用于加载代理类。可以通过目标对象获取类加载器 - Class[] interfaces : 代理类实现的接口的字节码对象 - InvocationHandler h : 代理对象的调用处理程序 - */ - SellTickets proxyObject = (SellTickets) Proxy.newProxyInstance( - station.getClass().getClassLoader(), - station.getClass().getInterfaces(), - new InvocationHandler() { - - /* - Object proxy : 代理对象。和proxyObject对象是同一个对象,在invoke方法中基本不用 - Method method : 对接口中的方法进行封装的method对象 - Object[] args : 调用方法的实际参数 - - 返回值: 方法的返回值。 - */ - - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - //System.out.println("invoke方法执行了"); - System.out.println("代售点收取一定的服务费用(jdk动态代理)"); - //执行目标对象的方法 - Object obj = method.invoke(station, args); - return obj; - } - } - ); - return proxyObject; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/SellTickets.java b/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/SellTickets.java deleted file mode 100644 index f0f4d68f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/jdk_proxy/SellTickets.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.proxy.jdk_proxy; - -/* - * 卖火车票的接口 - * @author 方鹏 - * @date 2022/2/7 6:11 下午 - */ -public interface SellTickets { - - void sell(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/Client.java b/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/Client.java deleted file mode 100644 index 124cc5e1..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/Client.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.proxy.static_proxy; - -/** - * @author 方鹏 - * @date 2022年02月07日 6:14 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建代售点类对象 - ProxyPoint proxyPoint = new ProxyPoint(); - //调用方法进行买票 - proxyPoint.sell(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/ProxyPoint.java b/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/ProxyPoint.java deleted file mode 100644 index 1e96cbb7..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/ProxyPoint.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.proxy.static_proxy; - -/** - * 代售点类 - * @author 方鹏 - * @date 2022年02月07日 6:12 下午 - */ -public class ProxyPoint implements SellTickets { - - //声明火车站类对象 - private TrainStation trainStation = new TrainStation(); - - @Override - public void sell() { - System.out.println("代售点收取一些服务费用"); - trainStation.sell(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/SellTickets.java b/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/SellTickets.java deleted file mode 100644 index 73ef3dfa..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/SellTickets.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.proxy.static_proxy; - -/* - * 卖火车票的接口 - * @author 方鹏 - * @date 2022/2/7 6:11 下午 - */ -public interface SellTickets { - - void sell(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/TrainStation.java b/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/TrainStation.java deleted file mode 100644 index b3ab4aab..00000000 --- a/src/main/java/com/fangpeng/design/pattern/proxy/static_proxy/TrainStation.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.design.pattern.proxy.static_proxy; - -/** - * 火车站类 - * @author 方鹏 - * @date 2022年02月07日 6:11 下午 - */ -public class TrainStation implements SellTickets { - - public void sell() { - System.out.println("火车站卖票"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/Client.java b/src/main/java/com/fangpeng/design/pattern/responsibility/Client.java deleted file mode 100644 index 2243e07c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/Client.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.fangpeng.design.pattern.responsibility; - -/** - * @author 方鹏 - * @date 2022年02月08日 5:05 下午 - */ -public class Client { - public static void main(String[] args) { - //创建一个请假条对象 - LeaveRequest leave = new LeaveRequest("小明",2,"身体不适"); - - //创建各级领导对象 - GroupLeader groupLeader = new GroupLeader(); - Manager manager = new Manager(); - GeneralManager generalManager = new GeneralManager(); - - //设置处理者链 - groupLeader.setNextHandler(manager); - manager.setNextHandler(generalManager); - - - //小明提交请假申请 - groupLeader.submit(leave); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/GeneralManager.java b/src/main/java/com/fangpeng/design/pattern/responsibility/GeneralManager.java deleted file mode 100644 index dc8a8250..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/GeneralManager.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.responsibility; - -/** - * 总经理类(具体的处理者) - * @author 方鹏 - * @date 2022年02月08日 5:04 下午 - */ -public class GeneralManager extends Handler { - - public GeneralManager() { - super(Handler.NUM_THREE,Handler.NUM_SEVEN); - } - - @Override - protected void handleLeave(LeaveRequest leave) { - System.out.println(leave.getName() + "请假" + leave.getNum() + "天," + leave.getContent() + "。"); - System.out.println("总经理审批:同意"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/GroupLeader.java b/src/main/java/com/fangpeng/design/pattern/responsibility/GroupLeader.java deleted file mode 100644 index 92ea295f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/GroupLeader.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.responsibility; - -/** - * 小组长类(具体的处理者) - * @author 方鹏 - * @date 2022年02月08日 5:02 下午 - */ -public class GroupLeader extends Handler { - - public GroupLeader() { - super(0, Handler.NUM_ONE); - } - - @Override - protected void handleLeave(LeaveRequest leave) { - System.out.println(leave.getName() + "请假" + leave.getNum() + "天," + leave.getContent() + "。"); - System.out.println("小组长审批:同意"); - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/Handler.java b/src/main/java/com/fangpeng/design/pattern/responsibility/Handler.java deleted file mode 100644 index 3b575ded..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/Handler.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.fangpeng.design.pattern.responsibility; - -/** - * 抽象处理者类 - * @author 方鹏 - * @date 2022年02月08日 4:56 下午 - */ -public abstract class Handler { - - protected final static int NUM_ONE = 1; - protected final static int NUM_THREE = 3; - protected final static int NUM_SEVEN = 7; - - //该领导处理的请求天数区间 - private int numStart; - private int numEnd; - - //声明后续者(声明上级领导) - private Handler nextHandler; - - public Handler(int numStart) { - this.numStart = numStart; - } - - public Handler(int numStart, int numEnd) { - this.numStart = numStart; - this.numEnd = numEnd; - } - - //设置上级领导对象 - public void setNextHandler(Handler nextHandler) { - this.nextHandler = nextHandler; - } - - //各级领导处理请求条的方法 - protected abstract void handleLeave(LeaveRequest leave); - - //提交请求条 - public final void submit(LeaveRequest leave) { - //该领导进行审批 - this.handleLeave(leave); - if(this.nextHandler != null && leave.getNum() > this.numEnd) { - //提交给上级领导进行审批 - this.nextHandler.submit(leave); - } else { - System.out.println("流程结束!"); - } - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/LeaveRequest.java b/src/main/java/com/fangpeng/design/pattern/responsibility/LeaveRequest.java deleted file mode 100644 index 4da92df3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/LeaveRequest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fangpeng.design.pattern.responsibility; - -/** - * 请假条类 - * @author 方鹏 - * @date 2022年02月08日 4:55 下午 - */ -public class LeaveRequest { - - //姓名 - private String name; - - //请假天数 - private int num; - - //请假内容 - private String content; - - public LeaveRequest(String name, int num, String content) { - this.name = name; - this.num = num; - this.content = content; - } - - public String getName() { - return name; - } - - public int getNum() { - return num; - } - - public String getContent() { - return content; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/Manager.java b/src/main/java/com/fangpeng/design/pattern/responsibility/Manager.java deleted file mode 100644 index a520aad4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/Manager.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.design.pattern.responsibility; - -/** - * 部门经理类(具体的处理者) - * @author 方鹏 - * @date 2022年02月08日 5:03 下午 - */ -public class Manager extends Handler { - - public Manager() { - super(Handler.NUM_ONE,Handler.NUM_THREE); - } - - @Override - protected void handleLeave(LeaveRequest leave) { - System.out.println(leave.getName() + "请假" + leave.getNum() + "天," + leave.getContent() + "。"); - System.out.println("部门经理审批:同意"); - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Client.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Client.java deleted file mode 100644 index e578fdb4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Client.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -/** - * @version v1.0 - * @ClassName: Client - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public class Client { - public static void main(String[] args) { - Request req = null; - Response res = null ; - - FilterChain filterChain = new FilterChain(); - filterChain.addFilter(new FirstFilter()).addFilter(new SecondFilter()); - filterChain.doFilter(req,res); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Filter.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Filter.java deleted file mode 100644 index 9a5e4162..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Filter.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -/** - * @version v1.0 - * @ClassName: Filter - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public interface Filter { - public void doFilter(Request req,Response res,FilterChain c); -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/FilterChain.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/FilterChain.java deleted file mode 100644 index 86f80109..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/FilterChain.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -import java.util.ArrayList; -import java.util.List; - -/** - * @version v1.0 - * @ClassName: FilterChain - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public class FilterChain { //过滤器链 - - private List filters = new ArrayList(); - - private int index = 0; - - // 链式调用 - public FilterChain addFilter(Filter filter) { - this.filters.add(filter); - return this; - } - - public void doFilter(Request request, Response response) { - if (index == filters.size()) { - return; - } - Filter filter = filters.get(index); - index++; - filter.doFilter(request, response, this); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/FirstFilter.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/FirstFilter.java deleted file mode 100644 index 23269818..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/FirstFilter.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -/** - * @version v1.0 - * @ClassName: FirstFilter - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public class FirstFilter implements Filter { - @Override - public void doFilter(Request req, Response res, FilterChain chain) { - System.out.println("过滤器1 前置处理"); - - // 先执行所有request再倒序执行所有response - chain.doFilter(req, res); - - System.out.println("过滤器1 后置处理"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Request.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Request.java deleted file mode 100644 index 7effe065..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Request.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -/** - * @version v1.0 - * @ClassName: Request - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public interface Request { -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Response.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Response.java deleted file mode 100644 index 59e4ddc7..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/Response.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -/** - * @version v1.0 - * @ClassName: Response - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public interface Response { -} diff --git a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/SecondFilter.java b/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/SecondFilter.java deleted file mode 100644 index a6b3b850..00000000 --- a/src/main/java/com/fangpeng/design/pattern/responsibility/jdk/SecondFilter.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.responsibility.jdk; - -/** - * @version v1.0 - * @ClassName: FirstFilter - * @Description: TODO(一句话描述该类的功能) - * @Author: Lemon-CS - */ -public class SecondFilter implements Filter { - @Override - public void doFilter(Request req, Response res, FilterChain chain) { - System.out.println("过滤器2 前置处理"); - - // 先执行所有request再倒序执行所有response - chain.doFilter(req, res); - - System.out.println("过滤器2 后置处理"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/RuntimeDemo.java b/src/main/java/com/fangpeng/design/pattern/singleton/RuntimeDemo.java deleted file mode 100644 index 3b2125f7..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/RuntimeDemo.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.singleton; - -import java.io.IOException; -import java.io.InputStream; - -public class RuntimeDemo { - - public static void main(String[] args) throws IOException { - //获取Runtime类的对象 - Runtime runtime = Runtime.getRuntime(); - - //调用runtime的方法exec, 参数要的是一个命令 - Process process = runtime.exec("ls"); - //调用process对象的获取输入流的方法 - InputStream is = process.getInputStream(); - byte[] arr = new byte[1024 * 1024 * 100]; - //读取数据 - int len = is.read(arr);//返回读到的字节的个数 - //将字节数组转换为字符串输出到控制台 - System.out.println(new String(arr,0, len ,"UTF-8")); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo1/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo1/Client.java deleted file mode 100644 index 48a93851..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo1/Client.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo1; - -public class Client { - - public static void main(String[] args) { - //创建Singletion类的对象 - Singleton instance = Singleton.getInstance(); - - Singleton instance1 = Singleton.getInstance(); - - //判断获取到的两个是否是同一个对象 - System.out.println(instance == instance1); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo1/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo1/Singleton.java deleted file mode 100644 index 6a539cbb..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo1/Singleton.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo1; - -/* - 饿汉式: 静态成员变量 - */ -public class Singleton { - - //1,私有构造方法 - private Singleton() { - - } - - //2,在本类中创建本类对象 - private static Singleton instance = new Singleton(); - - //3,提供一个公共的访问方式,让外界获取该对象 - public static Singleton getInstance() { - return instance; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo2/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo2/Client.java deleted file mode 100644 index a98a28b0..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo2/Client.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo2; - -public class Client { - - public static void main(String[] args) { - Singleton instance = Singleton.getInstance(); - - Singleton instance1 = Singleton.getInstance(); - - //判断两次获取到的Singleton对象是否是同一个对象 - System.out.println(instance == instance1); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo2/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo2/Singleton.java deleted file mode 100644 index 056263ae..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo2/Singleton.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo2; - -/* - 饿汉式 : 静态代码块 - */ -public class Singleton { - - //私有构造方法 - private Singleton() { - - } - - //声明Singleton类型的变量 - private static Singleton instance; - - //在静态代码块中进行赋值 - static { - instance = new Singleton(); - } - - //对外提供获取该类对象的方法 - public static Singleton getInstance() { - return instance; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo3/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo3/Client.java deleted file mode 100644 index e8deb15f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo3/Client.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo3; - -import com.fangpeng.design.pattern.singleton.demo2.Singleton; - -public class Client { - - public static void main(String[] args) { - com.fangpeng.design.pattern.singleton.demo2.Singleton instance = com.fangpeng.design.pattern.singleton.demo2.Singleton.getInstance(); - - com.fangpeng.design.pattern.singleton.demo2.Singleton instance1 = Singleton.getInstance(); - - //判断两次获取到的Singleton对象是否是同一个对象 - System.out.println(instance == instance1); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo3/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo3/Singleton.java deleted file mode 100644 index abe36270..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo3/Singleton.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo3; - -/* - 懒汉式 - */ -public class Singleton { - - //私有构造方法 - private Singleton() {} - - //声明Singleton类型的变量instance - //只是声明一个该类型的变量,并没有进行赋值 - private static Singleton instance; - - //对外提供访问方式 - public static synchronized Singleton getInstance() { - //判断instance是否为null,如果为null,说明还没有创建Singleton类的对象 - //如果没有,创建一个并返回,如果有,直接返回 - if (instance == null) { - //线程1等待,线程2获取到cpu的执行权,也会进入到该判断里面 - instance = new Singleton(); - } - return instance; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo4/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo4/Client.java deleted file mode 100644 index e11a8f4f..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo4/Client.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo4; - -import com.fangpeng.design.pattern.singleton.demo4.Singleton; - -public class Client { - - public static void main(String[] args) { - Singleton instance = Singleton.getInstance(); - - Singleton instance1 = Singleton.getInstance(); - - //判断两次获取到的Singleton对象是否是同一个对象 - System.out.println(instance == instance1); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo4/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo4/Singleton.java deleted file mode 100644 index 1c51206a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo4/Singleton.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo4; - -import javax.swing.plaf.synth.SynthViewportUI; - -/* - 双重检查锁方式 - */ -public class Singleton { - - //私有构造方法 - private Singleton() {} - - //声明Singleton类型的变量 - private static volatile Singleton instance; - - //对外提供公共的访问方式 - public static Singleton getInstance() { - //第一次判断,如果instance的值不为null,不需要抢占锁,直接返回对象 - if (instance == null) { - synchronized (Singleton.class) { - //第二次判断 - if (instance == null) { - instance = new Singleton(); - } - } - } - return instance; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo5/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo5/Client.java deleted file mode 100644 index 8cdec49a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo5/Client.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo5; - -import com.fangpeng.design.pattern.singleton.demo5.Singleton; - -public class Client { - - public static void main(String[] args) { - Singleton instance = Singleton.getInstance(); - - Singleton instance1 = Singleton.getInstance(); - - //判断两次获取到的Singleton对象是否是同一个对象 - System.out.println(instance == instance1); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo5/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo5/Singleton.java deleted file mode 100644 index fa414dee..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo5/Singleton.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo5; - -/* - 静态内部类方式 - */ -public class Singleton { - - //私有构造方法 - private Singleton() {} - - //定义一个静态内部类 - private static class SingletonHolder { - private static final Singleton INSTANCE = new Singleton(); - } - - //提供公共的访问方式 - public static Singleton getInstance() { - return SingletonHolder.INSTANCE; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo6/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo6/Client.java deleted file mode 100644 index f2699ac4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo6/Client.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo6; - -public class Client { - - public static void main(String[] args) { - Singleton instance = Singleton.INSTANCE; - Singleton instance1 = Singleton.INSTANCE; - - System.out.println(instance == instance1); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo6/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo6/Singleton.java deleted file mode 100644 index 398ed8fe..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo6/Singleton.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo6; - -/* - 枚举实现方式 - */ -public enum Singleton { - INSTANCE; -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo7/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo7/Client.java deleted file mode 100644 index aecd01b2..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo7/Client.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo7; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; - -/* - 测试使用序列化破坏单例模式 - */ -public class Client { - - public static void main(String[] args) throws Exception { - //writeObject2File(); - readObjectFromFile(); - readObjectFromFile(); - } - - //从文件读取数据(对象) - public static void readObjectFromFile() throws Exception { - //1,创建对象输入流对象 - ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\Think\\Desktop\\a.txt")); - //2,读取对象 - Singleton instance = (Singleton) ois.readObject(); - - System.out.println(instance); - - //释放资源 - ois.close(); - } - - //向文件中写数据(对象) - public static void writeObject2File() throws Exception { - //1,获取Singleton对象 - Singleton instance = Singleton.getInstance(); - //2,创建对象输出流对象 - ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\Think\\Desktop\\a.txt")); - //3,写对象 - oos.writeObject(instance); - //4,释放资源 - oos.close(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo7/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo7/Singleton.java deleted file mode 100644 index 96e512c3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo7/Singleton.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo7; - -/* - 静态内部类方式 - */ -public class Singleton { - - //私有构造方法 - private Singleton() {} - - //定义一个静态内部类 - private static class SingletonHolder { - private static final Singleton INSTANCE = new Singleton(); - } - - //提供公共的访问方式 - public static Singleton getInstance() { - return SingletonHolder.INSTANCE; - } - - //当进行反序列化时,会自动调用该方法,将该方法的返回值直接返回 - public Object readResolve() { - return SingletonHolder.INSTANCE; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo8/Client.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo8/Client.java deleted file mode 100644 index 5477ff5b..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo8/Client.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo8; - -import java.lang.reflect.Constructor; - -public class Client { - - public static void main(String[] args) throws Exception { - //1,获取Singleton的字节码对象 - Class clazz = Singleton.class; - - //2,获取无参构造方法对象 - Constructor constructor = clazz.getDeclaredConstructor(); - - //3,取消访问检查 - constructor.setAccessible(true); - - //4,创建Singleton对象 - Singleton s1 = (Singleton) constructor.newInstance(); - Singleton s2 = (Singleton) constructor.newInstance(); - - System.out.println(s1 == s2); //如果返回的是true,说明并没有破坏单例模式,如果是false,说明破坏了单例模式 - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/singleton/demo8/Singleton.java b/src/main/java/com/fangpeng/design/pattern/singleton/demo8/Singleton.java deleted file mode 100644 index dea8168e..00000000 --- a/src/main/java/com/fangpeng/design/pattern/singleton/demo8/Singleton.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fangpeng.design.pattern.singleton.demo8; - -public class Singleton { - - private static boolean flag = false; - - //私有构造方法 - private Singleton() { - synchronized (Singleton.class) { - - //判断flag的值是否是true,如果是true,说明非第一次访问,直接抛一个异常,如果是false的话,说明第一次访问 - if (flag) { - throw new RuntimeException("不能创建多个对象"); - } - //将flag的值设置为true - flag = true; - } - } - - //定义一个静态内部类 - private static class SingletonHolder { - //在内部类中声明并初始化外部类的对象 - private static final Singleton INSTANCE = new Singleton(); - } - - //提供公共的访问方式 - public static Singleton getInstance() { - return SingletonHolder.INSTANCE; - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/Client.java b/src/main/java/com/fangpeng/design/pattern/state/after/Client.java deleted file mode 100644 index 6e7bbd9a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/Client.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * @author 方鹏 - * @date 2022年02月08日 6:12 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建环境角色对象 - Context context = new Context(); - //设置当前电梯装填 - context.setLiftState(new ClosingState()); - - context.open(); - context.run(); - context.close(); - context.stop(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/ClosingState.java b/src/main/java/com/fangpeng/design/pattern/state/after/ClosingState.java deleted file mode 100644 index 3f3cd37a..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/ClosingState.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * 电梯关闭状态类 - * @author 方鹏 - * @date 2022年02月08日 6:07 下午 - */ -public class ClosingState extends LiftState { - @Override - //电梯门关闭,这是关闭状态要实现的动作 - public void close() { - System.out.println("电梯门关闭..."); - } - - //电梯门关了再打开,逗你玩呢,那这个允许呀 - @Override - public void open() { - super.context.setLiftState(Context.OPENING_STATE); - super.context.open(); - } - - - //电梯门关了就跑,这是再正常不过了 - @Override - public void run() { - super.context.setLiftState(Context.RUNNING_STATE); - super.context.run(); - } - - //电梯门关着,我就不按楼层 - @Override - public void stop() { - super.context.setLiftState(Context.STOPPING_STATE); - super.context.stop(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/Context.java b/src/main/java/com/fangpeng/design/pattern/state/after/Context.java deleted file mode 100644 index 79ff694c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/Context.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * 环境角色类 - * @author 方鹏 - * @date 2022年02月08日 6:05 下午 - */ -public class Context { - - //定义对应状态对象的常量 - public final static OpeningState OPENING_STATE = new OpeningState(); - public final static ClosingState CLOSING_STATE = new ClosingState(); - public final static RunningState RUNNING_STATE = new RunningState(); - public final static StoppingState STOPPING_STATE = new StoppingState(); - - //定义一个当前电梯状态变量 - private LiftState liftState; - - public LiftState getLiftState() { - return liftState; - } - - //设置当前状态对象 - public void setLiftState(LiftState liftState) { - this.liftState = liftState; - //设置当前状态对象中的Context对象 - this.liftState.setContext(this); - } - - public void open() { - this.liftState.open(); - } - - public void close() { - this.liftState.close(); - } - - public void run() { - this.liftState.run(); - } - - public void stop() { - this.liftState.stop(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/LiftState.java b/src/main/java/com/fangpeng/design/pattern/state/after/LiftState.java deleted file mode 100644 index 0006dfab..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/LiftState.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * 抽象状态类 - * @author 方鹏 - * @date 2022年02月08日 6:05 下午 - */ -public abstract class LiftState { - - //声明环境角色类变量 - protected Context context; - - public void setContext(Context context) { - this.context = context; - } - - //电梯开启操作 - public abstract void open(); - - //电梯关闭操作 - public abstract void close(); - - //电梯运行操作 - public abstract void run(); - - //电梯停止操作 - public abstract void stop(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/OpeningState.java b/src/main/java/com/fangpeng/design/pattern/state/after/OpeningState.java deleted file mode 100644 index b9f3e898..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/OpeningState.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * 电梯开启状态类 - * @author 方鹏 - * @date 2022年02月08日 6:07 下午 - */ -public class OpeningState extends LiftState { - //当前状态要执行的方法 - @Override - public void open() { - System.out.println("电梯开启。。。"); - } - - @Override - public void close() { - //修改状态 - super.context.setLiftState(Context.CLOSING_STATE); - //调用当前状态中的context中的close方法 - super.context.close(); - } - - @Override - public void run() { - //什么都不做 - } - - @Override - public void stop() { - //什么都不做 - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/RunningState.java b/src/main/java/com/fangpeng/design/pattern/state/after/RunningState.java deleted file mode 100644 index d54700dd..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/RunningState.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * 电梯运行状态类 - * @author 方鹏 - * @date 2022年02月08日 6:08 下午 - */ -public class RunningState extends LiftState { - //运行的时候开电梯门?你疯了!电梯不会给你开的 - @Override - public void open() { - //do nothing - } - - //电梯门关闭?这是肯定了 - @Override - public void close() {//虽然可以关门,但这个动作不归我执行 - //do nothing - } - - //这是在运行状态下要实现的方法 - @Override - public void run() { - System.out.println("电梯正在运行..."); - } - - //这个事绝对是合理的,光运行不停止还有谁敢做这个电梯?!估计只有上帝了 - @Override - public void stop() { - super.context.setLiftState(Context.STOPPING_STATE); - super.context.stop(); - } -} - diff --git a/src/main/java/com/fangpeng/design/pattern/state/after/StoppingState.java b/src/main/java/com/fangpeng/design/pattern/state/after/StoppingState.java deleted file mode 100644 index 39b5239d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/after/StoppingState.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.design.pattern.state.after; - -/** - * 电梯停止状态类 - * @author 方鹏 - * @date 2022年02月08日 6:09 下午 - */ -public class StoppingState extends LiftState { - //停止状态,开门,那是要的! - @Override - public void open() { - //状态修改 - super.context.setLiftState(Context.OPENING_STATE); - //动作委托为CloseState来执行,也就是委托给了ClosingState子类执行这个动作 - super.context.getLiftState().open(); - } - - @Override - public void close() {//虽然可以关门,但这个动作不归我执行 - //状态修改 - super.context.setLiftState(Context.CLOSING_STATE); - //动作委托为CloseState来执行,也就是委托给了ClosingState子类执行这个动作 - super.context.getLiftState().close(); - } - - //停止状态再跑起来,正常的很 - @Override - public void run() { - //状态修改 - super.context.setLiftState(Context.RUNNING_STATE); - //动作委托为CloseState来执行,也就是委托给了ClosingState子类执行这个动作 - super.context.getLiftState().run(); - } - - //停止状态是怎么发生的呢?当然是停止方法执行了 - @Override - public void stop() { - System.out.println("电梯停止了..."); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/before/Client.java b/src/main/java/com/fangpeng/design/pattern/state/before/Client.java deleted file mode 100644 index ccb3a8d9..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/before/Client.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.pattern.state.before; - -/** - * @author 方鹏 - * @date 2022年02月08日 5:25 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建电梯对象 - Lift lift = new Lift(); - - //设置当前电梯的状态 - lift.setState(ILift.CLOSING_STATE); - - //打开 - lift.open(); - lift.close(); - lift.run(); - lift.stop(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/before/ILift.java b/src/main/java/com/fangpeng/design/pattern/state/before/ILift.java deleted file mode 100644 index 3c4d9a46..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/before/ILift.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.fangpeng.design.pattern.state.before; - -/** - * @version v1.0 - * @ClassName: ILift - * @Description: 电梯接口 - * @Author: Lemon-CS - */ -public interface ILift { - - //定义四个电梯状态的常量 - int OPENING_STATE = 1; - int CLOSING_STATE = 2; - int RUNNING_STATE = 3; - int STOPPING_STATE = 4; - - //设置电梯状态的功能 - void setState(int state); - - //电梯操作功能 - void open(); - - void close(); - - void run(); - - void stop(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/state/before/Lift.java b/src/main/java/com/fangpeng/design/pattern/state/before/Lift.java deleted file mode 100644 index 2898c46d..00000000 --- a/src/main/java/com/fangpeng/design/pattern/state/before/Lift.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.fangpeng.design.pattern.state.before; - -/** - * 电梯类(ILift的子实现类) - * @author 方鹏 - * @date 2022年02月08日 5:22 下午 - */ -public class Lift implements ILift { - - //声明一个记录当前电梯的状态 - private int state; - - @Override - public void setState(int state) { - this.state = state; - } - - @Override - public void open() { - switch (state) { //当前电梯状态 - case OPENING_STATE : - //什么事都不做 - break; - case CLOSING_STATE : - System.out.println("电梯打开了..."); - //设置当前电梯状态为开启状态 - setState(OPENING_STATE); - break; - case STOPPING_STATE : - System.out.println("电梯打开了..."); - //设置当前电梯状态为开启状态 - setState(OPENING_STATE); - break; - case RUNNING_STATE : - //什么事都不做 - break; - } - } - - @Override - public void close() { - switch (this.state) { - case OPENING_STATE: - System.out.println("电梯关门了。。。");//只有开门状态可以关闭电梯门,可以对应电梯状态表来看 - this.setState(CLOSING_STATE);//关门之后电梯就是关闭状态了 - break; - case CLOSING_STATE: - //do nothing //已经是关门状态,不能关门 - break; - case RUNNING_STATE: - //do nothing //运行时电梯门是关着的,不能关门 - break; - case STOPPING_STATE: - //do nothing //停止时电梯也是关着的,不能关门 - break; - } - } - - @Override - public void run() { - switch (this.state) { - case OPENING_STATE://电梯不能开着门就走 - //do nothing - break; - case CLOSING_STATE://门关了,可以运行了 - System.out.println("电梯开始运行了。。。"); - this.setState(RUNNING_STATE);//现在是运行状态 - break; - case RUNNING_STATE: - //do nothing 已经是运行状态了 - break; - case STOPPING_STATE: - System.out.println("电梯开始运行了。。。"); - this.setState(RUNNING_STATE); - break; - } - } - - @Override - public void stop() { - switch (this.state) { - case OPENING_STATE: //开门的电梯已经是是停止的了(正常情况下) - //do nothing - break; - case CLOSING_STATE://关门时才可以停止 - System.out.println("电梯停止了。。。"); - this.setState(STOPPING_STATE); - break; - case RUNNING_STATE://运行时当然可以停止了 - System.out.println("电梯停止了。。。"); - this.setState(STOPPING_STATE); - break; - case STOPPING_STATE: - //do nothing - break; - } - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/strategy/Client.java b/src/main/java/com/fangpeng/design/pattern/strategy/Client.java deleted file mode 100644 index 29633ed1..00000000 --- a/src/main/java/com/fangpeng/design/pattern/strategy/Client.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.pattern.strategy; - -/** - * @author 方鹏 - * @date 2022年02月08日 3:41 下午 - */ -public class Client { - public static void main(String[] args) { - //春节来了,使用春节促销活动 - SalesMan salesMan = new SalesMan(new StrategyA()); - //展示促销活动 - salesMan.salesManShow(); - - System.out.println("=============="); - //中秋节到了,使用中秋节的促销活动 - salesMan.setStrategy(new StrategyB()); - //展示促销活动 - salesMan.salesManShow(); - - System.out.println("=============="); - //圣诞节到了,使用圣诞节的促销活动 - salesMan.setStrategy(new StrategyC()); - //展示促销活动 - salesMan.salesManShow(); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/strategy/SalesMan.java b/src/main/java/com/fangpeng/design/pattern/strategy/SalesMan.java deleted file mode 100644 index 5aaadb47..00000000 --- a/src/main/java/com/fangpeng/design/pattern/strategy/SalesMan.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.fangpeng.design.pattern.strategy; - -/** - * 促销员(环境类) - * @author 方鹏 - * @date 2022年02月08日 3:40 下午 - */ -public class SalesMan { - - //聚合策略类对象 - private Strategy strategy; - - public SalesMan(Strategy strategy) { - this.strategy = strategy; - } - - public Strategy getStrategy() { - return strategy; - } - - public void setStrategy(Strategy strategy) { - this.strategy = strategy; - } - - //由促销员展示促销活动给用户 - public void salesManShow() { - strategy.show(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/strategy/Strategy.java b/src/main/java/com/fangpeng/design/pattern/strategy/Strategy.java deleted file mode 100644 index 981defa3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/strategy/Strategy.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.design.pattern.strategy; - -/* - * 抽象策略类 - * @author 方鹏 - * @date 2022/2/8 3:37 下午 - */ -public interface Strategy { - - void show(); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/strategy/StrategyA.java b/src/main/java/com/fangpeng/design/pattern/strategy/StrategyA.java deleted file mode 100644 index e6602070..00000000 --- a/src/main/java/com/fangpeng/design/pattern/strategy/StrategyA.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.strategy; - -/** - * 具体策略类,封装算法 - * @author 方鹏 - * @date 2022年02月08日 3:38 下午 - */ -public class StrategyA implements Strategy { - - @Override - public void show() { - System.out.println("买一送一"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/strategy/StrategyB.java b/src/main/java/com/fangpeng/design/pattern/strategy/StrategyB.java deleted file mode 100644 index cd22410c..00000000 --- a/src/main/java/com/fangpeng/design/pattern/strategy/StrategyB.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.strategy; - -/** - * 具体策略类,封装算法 - * @author 方鹏 - * @date 2022年02月08日 3:38 下午 - */ -public class StrategyB implements Strategy { - - @Override - public void show() { - System.out.println("满200元减50元"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/strategy/StrategyC.java b/src/main/java/com/fangpeng/design/pattern/strategy/StrategyC.java deleted file mode 100644 index 690e9639..00000000 --- a/src/main/java/com/fangpeng/design/pattern/strategy/StrategyC.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.strategy; - -/** - * 具体策略类,封装算法 - * @author 方鹏 - * @date 2022年02月08日 3:38 下午 - */ -public class StrategyC implements Strategy { - - @Override - public void show() { - System.out.println("满1000元加一元换购任意200元以下商品"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/template/AbstractClass.java b/src/main/java/com/fangpeng/design/pattern/template/AbstractClass.java deleted file mode 100644 index 5b3579b3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/template/AbstractClass.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.design.pattern.template; - -/** - * 抽象类(定义模板方法和基本方法) - * @author 方鹏 - * @date 2022年02月08日 3:08 下午 - */ -public abstract class AbstractClass { - - //模板方法定义 - public final void cookProcess() { - pourOil(); - heatOil(); - pourVegetable(); - pourSauce(); - fry(); - } - - public void pourOil() { - System.out.println("倒油"); - } - - //第二步:热油是一样的,所以直接实现 - public void heatOil() { - System.out.println("热油"); - } - - //第三步:倒蔬菜是不一样的(一个下包菜,一个是下菜心) - public abstract void pourVegetable(); - - //第四步:倒调味料是不一样 - public abstract void pourSauce(); - - - //第五步:翻炒是一样的,所以直接实现 - public void fry(){ - System.out.println("炒啊炒啊炒到熟啊"); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/template/Client.java b/src/main/java/com/fangpeng/design/pattern/template/Client.java deleted file mode 100644 index ab5f9bf0..00000000 --- a/src/main/java/com/fangpeng/design/pattern/template/Client.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.pattern.template; - -/** - * @author 方鹏 - * @date 2022年02月08日 3:11 下午 - */ -public class Client { - - public static void main(String[] args) { - //炒包菜 - //创建对象 - ConcreteClass_BaoCai baoCai = new ConcreteClass_BaoCai(); - //调用炒菜的功能 - baoCai.cookProcess(); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/template/ConcreteClass_BaoCai.java b/src/main/java/com/fangpeng/design/pattern/template/ConcreteClass_BaoCai.java deleted file mode 100644 index 5e7e5b20..00000000 --- a/src/main/java/com/fangpeng/design/pattern/template/ConcreteClass_BaoCai.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.template; - -/** - * 炒包菜类 - * @author 方鹏 - * @date 2022年02月08日 3:10 下午 - */ -public class ConcreteClass_BaoCai extends AbstractClass { - - @Override - public void pourVegetable() { - System.out.println("下锅的蔬菜是包菜"); - } - - @Override - public void pourSauce() { - System.out.println("下锅的酱料是辣椒"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/template/ConcreteClass_CaiXin.java b/src/main/java/com/fangpeng/design/pattern/template/ConcreteClass_CaiXin.java deleted file mode 100644 index 2d04ea21..00000000 --- a/src/main/java/com/fangpeng/design/pattern/template/ConcreteClass_CaiXin.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.template; - -/** - * 炒菜心类 - * @author 方鹏 - * @date 2022年02月08日 3:10 下午 - */ -public class ConcreteClass_CaiXin extends AbstractClass { - - @Override - public void pourVegetable() { - System.out.println("下锅的蔬菜是菜心"); - } - - @Override - public void pourSauce() { - System.out.println("下锅的酱料是蒜蓉"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Animal.java b/src/main/java/com/fangpeng/design/pattern/visitor/Animal.java deleted file mode 100644 index 8fef8490..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Animal.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - - -/** - * 抽象元素角色类 - * @author 方鹏 - * @date 2022年02月08日 10:05 下午 - */ -public interface Animal { - - //接受访问者访问的功能 - void accept(Person person); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Cat.java b/src/main/java/com/fangpeng/design/pattern/visitor/Cat.java deleted file mode 100644 index da5bbaba..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Cat.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -/** - * 具体元素角色类(宠物猫) - * @author 方鹏 - * @date 2022年02月08日 10:07 下午 - */ -public class Cat implements Animal { - - @Override - public void accept(Person person) { - person.feed(this); //访问者给宠物猫喂食 - System.out.println("好好吃,喵喵喵。。。"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Client.java b/src/main/java/com/fangpeng/design/pattern/visitor/Client.java deleted file mode 100644 index b0762181..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Client.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -/** - * @author 方鹏 - * @date 2022年02月08日 10:11 下午 - */ -public class Client { - - public static void main(String[] args) { - //创建Home对象 - Home home = new Home(); - //添加元素到Home对象中 - home.add(new Dog()); - home.add(new Cat()); - - //创建主人对象 - Owner owner = new Owner(); - //让主人喂食所有的宠物 - home.action(owner); - } - -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Dog.java b/src/main/java/com/fangpeng/design/pattern/visitor/Dog.java deleted file mode 100644 index c9e0c5e4..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Dog.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -/** - * 具体元素角色类(宠物狗) - * @author 方鹏 - * @date 2022年02月08日 10:07 下午 - */ -public class Dog implements Animal { - - @Override - public void accept(Person person) { - person.feed(this); //访问者给宠物猫喂食 - System.out.println("好好吃,汪汪汪。。。"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Home.java b/src/main/java/com/fangpeng/design/pattern/visitor/Home.java deleted file mode 100644 index 28a86104..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Home.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -import java.util.ArrayList; -import java.util.List; - -/** - * 对象结构类 - * @author 方鹏 - * @date 2022年02月08日 10:10 下午 - */ -public class Home { - - //声明一个集合对象,用来存储元素对象 - private List nodeList = new ArrayList(); - - //添加元素功能 - public void add(Animal animal) { - nodeList.add(animal); - } - - public void action(Person person) { - //遍历集合,获取每一个元素,让访问者访问每一个元素 - for (Animal animal : nodeList) { - animal.accept(person); - } - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Owner.java b/src/main/java/com/fangpeng/design/pattern/visitor/Owner.java deleted file mode 100644 index 599b10b3..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Owner.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -/** - * 具体访问者角色类(自己) - * @author 方鹏 - * @date 2022年02月08日 10:08 下午 - */ -public class Owner implements Person { - @Override - public void feed(Cat cat) { - System.out.println("主人喂食猫"); - } - - @Override - public void feed(Dog dog) { - System.out.println("主人喂食狗"); - } -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Person.java b/src/main/java/com/fangpeng/design/pattern/visitor/Person.java deleted file mode 100644 index 78efa099..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Person.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -/* - * 抽象访问者角色类 - * @author 方鹏 - * @date 2022/2/8 10:06 下午 - */ -public interface Person { - - //喂食宠物狗 - void feed(Cat cat); - - //喂食宠物猫 - void feed(Dog dog); - -} diff --git a/src/main/java/com/fangpeng/design/pattern/visitor/Someone.java b/src/main/java/com/fangpeng/design/pattern/visitor/Someone.java deleted file mode 100644 index 1a1dac03..00000000 --- a/src/main/java/com/fangpeng/design/pattern/visitor/Someone.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.pattern.visitor; - -/** - * 具体访问者角色类(其他人) - * @author 方鹏 - * @date 2022年02月08日 10:09 下午 - */ -public class Someone implements Person { - - @Override - public void feed(Cat cat) { - System.out.println("其他人喂食猫"); - } - - @Override - public void feed(Dog dog) { - System.out.println("其他人喂食狗"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo1/AbstractSkin.java b/src/main/java/com/fangpeng/design/principles/demo1/AbstractSkin.java deleted file mode 100644 index 43e3957e..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo1/AbstractSkin.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.principles.demo1; - -/* - 抽象皮肤类 - */ -public abstract class AbstractSkin { - - // 显示的方法 - public abstract void display(); - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo1/Client.java b/src/main/java/com/fangpeng/design/principles/demo1/Client.java deleted file mode 100644 index 37ad361e..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo1/Client.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.principles.demo1; - -public class Client { - - public static void main(String[] args) { - // 1.创建搜狗输入法对象 - SougouInput input = new SougouInput(); - // 2.创建皮肤对象 - DefaultSkin skin = new DefaultSkin(); - // 3.将皮肤设置到输入法中 - input.setSkin(skin); - // 4.显示皮肤 - input.display(); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo1/DefaultSkin.java b/src/main/java/com/fangpeng/design/principles/demo1/DefaultSkin.java deleted file mode 100644 index e336896f..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo1/DefaultSkin.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.design.principles.demo1; - -/* - 默认皮肤类 - */ -public class DefaultSkin extends AbstractSkin { - - - @Override - public void display() { - System.out.println("默认皮肤"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo1/MySkin.java b/src/main/java/com/fangpeng/design/principles/demo1/MySkin.java deleted file mode 100644 index fa880221..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo1/MySkin.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.principles.demo1; - -/* - 我的自定义皮肤 - */ -public class MySkin extends AbstractSkin { - @Override - public void display() { - System.out.println("我的自定义皮肤"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo1/SougouInput.java b/src/main/java/com/fangpeng/design/principles/demo1/SougouInput.java deleted file mode 100644 index 7e789579..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo1/SougouInput.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.principles.demo1; - -/* - 搜狗输入法 - */ -public class SougouInput { - - private AbstractSkin skin; - - public void setSkin(AbstractSkin skin) { - this.skin = skin; - } - - public void display() { - skin.display(); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo2/after/Quadrilateral.java b/src/main/java/com/fangpeng/design/principles/demo2/after/Quadrilateral.java deleted file mode 100644 index 422c6ded..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/after/Quadrilateral.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.design.principles.demo2.after; - -/* - 四边形接口 - */ -public interface Quadrilateral { - - //获取长 - double getLength(); - - //获取宽 - double getWidth(); - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo2/after/Rectangle.java b/src/main/java/com/fangpeng/design/principles/demo2/after/Rectangle.java deleted file mode 100644 index 4b7f1dd7..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/after/Rectangle.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.design.principles.demo2.after; - -/* - 长方形类 - */ -public class Rectangle implements Quadrilateral { - - private double length; - private double width; - - public void setLength(double length) { - this.length = length; - } - - public void setWidth(double width) { - this.width = width; - } - - public double getLength() { - return length; - } - - public double getWidth() { - return width; - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo2/after/RectangleDemo.java b/src/main/java/com/fangpeng/design/principles/demo2/after/RectangleDemo.java deleted file mode 100644 index 99ce45e4..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/after/RectangleDemo.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.design.principles.demo2.after; - -import com.fangpeng.design.principles.demo2.after.Square; - -public class RectangleDemo { - - public static void main(String[] args) { - //创建长方形对象 - Rectangle r = new Rectangle(); - r.setLength(20); - r.setWidth(10); - //调用方法进行扩宽操作 - resize(r); - - printLengthAndWidth(r); - - System.out.println("=================="); - //创建正方形对象 - Square s = new Square(); - //设置长和宽 - s.setSide(10); - //调用resize方法进行扩宽 - printLengthAndWidth(s); - } - - //扩宽的方法 - public static void resize(Rectangle rectangle) { - //判断宽如果比长小,进行扩宽的操作 - while (rectangle.getWidth() <= rectangle.getLength()) { - rectangle.setWidth(rectangle.getWidth() + 1); - } - } - - //打印长和宽 - public static void printLengthAndWidth(Quadrilateral quadrilateral) { - System.out.println(quadrilateral.getLength()); - System.out.println(quadrilateral.getWidth()); - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/principles/demo2/after/Square.java b/src/main/java/com/fangpeng/design/principles/demo2/after/Square.java deleted file mode 100644 index 914e08ce..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/after/Square.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.fangpeng.design.principles.demo2.after; - -/* - 正方形类 - */ -public class Square implements Quadrilateral { - - private double side; - - @Override - public double getLength() { - return side; - } - - @Override - public double getWidth() { - return side; - } - - public double getSide() { - return side; - } - - public void setSide(double side) { - this.side = side; - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo2/before/Rectangle.java b/src/main/java/com/fangpeng/design/principles/demo2/before/Rectangle.java deleted file mode 100644 index e994edd9..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/before/Rectangle.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.design.principles.demo2.before; - -/* - 长方形类 - */ -public class Rectangle { - - private double length; - private double width; - - public double getLength() { - return length; - } - - public void setLength(double length) { - this.length = length; - } - - public double getWidth() { - return width; - } - - public void setWidth(double width) { - this.width = width; - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo2/before/RectangleDemo.java b/src/main/java/com/fangpeng/design/principles/demo2/before/RectangleDemo.java deleted file mode 100644 index c1244280..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/before/RectangleDemo.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.design.principles.demo2.before; - -public class RectangleDemo { - - public static void main(String[] args) { - //创建长方形对象 - Rectangle r = new Rectangle(); - //设置长和宽 - r.setLength(20); - r.setWidth(10); - //调用resize方法进行扩宽 - resize(r); - printLengthAndWidth(r); - - System.out.println("=================="); - //创建正方形对象 - Square s = new Square(); - //设置长和宽 - s.setLength(10); - //调用resize方法进行扩宽 - resize(s); - printLengthAndWidth(s); - } - - //扩宽方法 - public static void resize(Rectangle rectangle) { - //判断宽如果比长小,进行扩宽的操作 - while(rectangle.getWidth() <= rectangle.getLength()) { - rectangle.setWidth(rectangle.getWidth() + 1); - } - } - - //打印长和宽 - public static void printLengthAndWidth(Rectangle rectangle) { - System.out.println(rectangle.getLength()); - System.out.println(rectangle.getWidth()); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo2/before/Square.java b/src/main/java/com/fangpeng/design/principles/demo2/before/Square.java deleted file mode 100644 index aa63cdc3..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo2/before/Square.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.principles.demo2.before; - -/* - 正方形类 - */ -public class Square extends Rectangle { - @Override - public void setLength(double length) { - super.setLength(length); - super.setWidth(length); - } - - @Override - public void setWidth(double width) { - super.setWidth(width); - super.setLength(width); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/Computer.java b/src/main/java/com/fangpeng/design/principles/demo3/after/Computer.java deleted file mode 100644 index 07dcd309..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/Computer.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public class Computer { - - private HardDisk hardDisk; - private Cpu cpu; - private Memory memory; - - public HardDisk getHardDisk() { - return hardDisk; - } - - public void setHardDisk(HardDisk hardDisk) { - this.hardDisk = hardDisk; - } - - public Cpu getCpu() { - return cpu; - } - - public void setCpu(Cpu cpu) { - this.cpu = cpu; - } - - public Memory getMemory() { - return memory; - } - - public void setMemory(Memory memory) { - this.memory = memory; - } - - //运行计算机 - public void run() { - System.out.println("运行计算机"); - String data = hardDisk.get(); - System.out.println("从硬盘上获取的数据是:" + data); - cpu.run(); - memory.save(); - } -} - diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/ComputerDemo.java b/src/main/java/com/fangpeng/design/principles/demo3/after/ComputerDemo.java deleted file mode 100644 index 45efda0b..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/ComputerDemo.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public class ComputerDemo { - - public static void main(String[] args) { - - //创建计算机的组件对象 - HardDisk hardDisk = new XiJieHardDisk(); - Cpu cpu = new IntelCpu(); - Memory memory = new KingstonMemory(); - - //创建计算机对象 - Computer c = new Computer(); - //组装计算机 - c.setCpu(cpu); - c.setHardDisk(hardDisk); - c.setMemory(memory); - - //运行计算机 - c.run(); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/Cpu.java b/src/main/java/com/fangpeng/design/principles/demo3/after/Cpu.java deleted file mode 100644 index 2f61d956..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/Cpu.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public interface Cpu { - //运行cpu - public void run(); -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/HardDisk.java b/src/main/java/com/fangpeng/design/principles/demo3/after/HardDisk.java deleted file mode 100644 index 525d662c..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/HardDisk.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public interface HardDisk { - - //存储数据 - public void save(String data); - - //获取数据 - public String get(); -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/IntelCpu.java b/src/main/java/com/fangpeng/design/principles/demo3/after/IntelCpu.java deleted file mode 100644 index 0c7101d2..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/IntelCpu.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public class IntelCpu implements Cpu { - - public void run() { - System.out.println("使用Intel处理器"); - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/KingstonMemory.java b/src/main/java/com/fangpeng/design/principles/demo3/after/KingstonMemory.java deleted file mode 100644 index ee5446b7..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/KingstonMemory.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public class KingstonMemory implements Memory { - - public void save() { - System.out.println("使用金士顿内存条"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/Memory.java b/src/main/java/com/fangpeng/design/principles/demo3/after/Memory.java deleted file mode 100644 index ba81b535..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/Memory.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public interface Memory { - - public void save(); -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/principles/demo3/after/XiJieHardDisk.java b/src/main/java/com/fangpeng/design/principles/demo3/after/XiJieHardDisk.java deleted file mode 100644 index 6147d5d0..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/after/XiJieHardDisk.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.principles.demo3.after; - -public class XiJieHardDisk implements HardDisk{ - - //存储数据的方法 - @Override - public void save(String data) { - System.out.println("使用希捷硬盘存储数据为:" + data); - } - - //获取数据的方法 - @Override - public String get() { - System.out.println("使用希捷希捷硬盘取数据"); - return "数据"; - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/before/Computer.java b/src/main/java/com/fangpeng/design/principles/demo3/before/Computer.java deleted file mode 100644 index 8fb0805a..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/before/Computer.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.design.principles.demo3.before; - -public class Computer { - - private XiJieHardDisk hardDisk; - private IntelCpu cpu; - private KingstonMemory memory; - - public XiJieHardDisk getHardDisk() { - return hardDisk; - } - - public void setHardDisk(XiJieHardDisk hardDisk) { - this.hardDisk = hardDisk; - } - - public IntelCpu getCpu() { - return cpu; - } - - public void setCpu(IntelCpu cpu) { - this.cpu = cpu; - } - - public KingstonMemory getMemory() { - return memory; - } - - public void setMemory(KingstonMemory memory) { - this.memory = memory; - } - - public void run() { - System.out.println("运行计算机"); - String data = hardDisk.get(); - System.out.println("从硬盘上获取的数据是:" + data); - cpu.run(); - memory.save(); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/before/ComputerDemo.java b/src/main/java/com/fangpeng/design/principles/demo3/before/ComputerDemo.java deleted file mode 100644 index 8ec0ca59..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/before/ComputerDemo.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.principles.demo3.before; - -public class ComputerDemo { - - public static void main(String[] args) { - //创建组件对象 - XiJieHardDisk hardDisk = new XiJieHardDisk(); - IntelCpu cpu = new IntelCpu(); - KingstonMemory memory = new KingstonMemory(); - - //创建计算机对象 - Computer c = new Computer(); - //组装计算机 - c.setCpu(cpu); - c.setHardDisk(hardDisk); - c.setMemory(memory); - - //运行计算机 - c.run(); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/before/IntelCpu.java b/src/main/java/com/fangpeng/design/principles/demo3/before/IntelCpu.java deleted file mode 100644 index 6b5c621e..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/before/IntelCpu.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.principles.demo3.before; - -/* - Intel cpu - */ -public class IntelCpu { - - public void run() { - System.out.println("使用Intel处理器"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/before/KingstonMemory.java b/src/main/java/com/fangpeng/design/principles/demo3/before/KingstonMemory.java deleted file mode 100644 index 4e83a085..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/before/KingstonMemory.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fangpeng.design.principles.demo3.before; - -/* - 金士顿内存条类 - */ -public class KingstonMemory { - - public void save() { - System.out.println("使用金士顿内存条"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo3/before/XiJieHardDisk.java b/src/main/java/com/fangpeng/design/principles/demo3/before/XiJieHardDisk.java deleted file mode 100644 index 41c2f977..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo3/before/XiJieHardDisk.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.design.principles.demo3.before; - -/* - 希捷硬盘 - */ -public class XiJieHardDisk { - - //存储数据的方法 - public void save(String data) { - System.out.println("使用希捷硬盘存储数据为:" + data); - } - - //获取数据的方法 - public String get() { - System.out.println("使用希捷希捷硬盘取数据"); - return "数据"; - } -} - diff --git a/src/main/java/com/fangpeng/design/principles/demo4/after/AntiTheft.java b/src/main/java/com/fangpeng/design/principles/demo4/after/AntiTheft.java deleted file mode 100644 index 4aa713d3..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/after/AntiTheft.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.principles.demo4.after; - -/* - 防盗接口 - */ -public interface AntiTheft { - void antiTheft(); -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/design/principles/demo4/after/Client.java b/src/main/java/com/fangpeng/design/principles/demo4/after/Client.java deleted file mode 100644 index 1a13f4d5..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/after/Client.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.principles.demo4.after; - -public class Client { - - public static void main(String[] args) { - //创建黑马安全门对象 - MySafetyDoor door = new MySafetyDoor(); - //调用功能 - door.antiTheft(); - door.fireproof(); - door.waterproof(); - - System.out.println("============"); - //创建传智安全门对象 - CustomSafetyDoor door1 = new CustomSafetyDoor(); - //调用功能 - door1.antiTheft(); - door1.fireproof(); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/after/CustomSafetyDoor.java b/src/main/java/com/fangpeng/design/principles/demo4/after/CustomSafetyDoor.java deleted file mode 100644 index fe28297e..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/after/CustomSafetyDoor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.design.principles.demo4.after; - -public class CustomSafetyDoor implements AntiTheft,Fireproof{ - @Override - public void antiTheft() { - System.out.println("防盗"); - } - - @Override - public void fireproof() { - System.out.println("防火"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/after/Fireproof.java b/src/main/java/com/fangpeng/design/principles/demo4/after/Fireproof.java deleted file mode 100644 index 86199979..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/after/Fireproof.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.principles.demo4.after; - -/* - 防火接口 - */ -public interface Fireproof { - void fireproof(); -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/after/MySafetyDoor.java b/src/main/java/com/fangpeng/design/principles/demo4/after/MySafetyDoor.java deleted file mode 100644 index 60affe1c..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/after/MySafetyDoor.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.design.principles.demo4.after; - -public class MySafetyDoor implements AntiTheft,Fireproof,Waterproof{ - @Override - public void antiTheft() { - System.out.println("防盗"); - } - - @Override - public void fireproof() { - System.out.println("防火"); - } - - @Override - public void waterproof() { - System.out.println("防水"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/after/Waterproof.java b/src/main/java/com/fangpeng/design/principles/demo4/after/Waterproof.java deleted file mode 100644 index 41417d74..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/after/Waterproof.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fangpeng.design.principles.demo4.after; - -/* - 防水接口 - */ -public interface Waterproof { - void waterproof(); -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/before/Client.java b/src/main/java/com/fangpeng/design/principles/demo4/before/Client.java deleted file mode 100644 index 9a39dd3c..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/before/Client.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.design.principles.demo4.before; - -public class Client { - public static void main(String[] args) { - MySafetyDoor door = new MySafetyDoor(); - door.antiTheft(); - door.fireProof(); - door.waterProof(); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/before/MySafetyDoor.java b/src/main/java/com/fangpeng/design/principles/demo4/before/MySafetyDoor.java deleted file mode 100644 index 89824297..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/before/MySafetyDoor.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.design.principles.demo4.before; - -/* - 自定义品牌的安全门 - */ -public class MySafetyDoor implements SafetyDoor{ - @Override - public void antiTheft() { - System.out.println("防盗"); - } - - @Override - public void fireProof() { - System.out.println("防火"); - } - - @Override - public void waterProof() { - System.out.println("防水"); - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo4/before/SafetyDoor.java b/src/main/java/com/fangpeng/design/principles/demo4/before/SafetyDoor.java deleted file mode 100644 index d230d380..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo4/before/SafetyDoor.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.principles.demo4.before; - -/* - 安全门接口 - */ -public interface SafetyDoor { - - //防盗 - void antiTheft(); - - //防火 - void fireProof(); - - //防水 - void waterProof(); - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo5/Agent.java b/src/main/java/com/fangpeng/design/principles/demo5/Agent.java deleted file mode 100644 index 694b3d1f..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo5/Agent.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.fangpeng.design.principles.demo5; - -/* - 经纪人类 - */ -public class Agent { - - private Star star; - private Fans fans; - private Company company; - - public void setStar(Star star) { - this.star = star; - } - - public void setFans(Fans fans) { - this.fans = fans; - } - - public void setCompany(Company company) { - this.company = company; - } - - //和粉丝见面的方法 - public void meeting() { - System.out.println(star.getName() + "和粉丝" + fans.getName() + "见面"); - } - - //和媒体公司洽谈的方法 - public void business() { - System.out.println(star.getName() + "和" + company.getName() + "洽谈"); - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo5/Client.java b/src/main/java/com/fangpeng/design/principles/demo5/Client.java deleted file mode 100644 index 1d81385f..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo5/Client.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.design.principles.demo5; - -public class Client { - - public static void main(String[] args) { - //创建经纪人类 - Agent agent = new Agent(); - //创建明星对象 - Star star = new Star("林青霞"); - agent.setStar(star); - //创建粉丝对象 - Fans fans = new Fans("李四"); - agent.setFans(fans); - //创建媒体公司对象 - Company company = new Company("黑马媒体公司"); - agent.setCompany(company); - - agent.meeting();//和粉丝见面 - agent.business();//和媒体公司洽谈业务 - } - -} diff --git a/src/main/java/com/fangpeng/design/principles/demo5/Company.java b/src/main/java/com/fangpeng/design/principles/demo5/Company.java deleted file mode 100644 index dc3305af..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo5/Company.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.design.principles.demo5; - -/* - 媒体公司类 - */ -public class Company { - private String name; - - public String getName() { - return name; - } - - public Company(String name) { - this.name = name; - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo5/Fans.java b/src/main/java/com/fangpeng/design/principles/demo5/Fans.java deleted file mode 100644 index 0407a0e0..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo5/Fans.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.principles.demo5; - -/* - 粉丝类 - */ -public class Fans { - - private String name; - - public String getName() { - return name; - } - - public Fans(String name) { - this.name = name; - } -} diff --git a/src/main/java/com/fangpeng/design/principles/demo5/Star.java b/src/main/java/com/fangpeng/design/principles/demo5/Star.java deleted file mode 100644 index 2e8931a3..00000000 --- a/src/main/java/com/fangpeng/design/principles/demo5/Star.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.design.principles.demo5; - -/* - 明星类 - */ -public class Star { - private String name; - - public Star(String name) { - this.name = name; - } - - public String getName() { - return name; - } -} - diff --git a/src/main/java/com/fangpeng/globalid/IdWorker.java b/src/main/java/com/fangpeng/globalid/IdWorker.java deleted file mode 100644 index 2b10f83f..00000000 --- a/src/main/java/com/fangpeng/globalid/IdWorker.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.fangpeng.globalid; - -/** - * @Description: 官方推出,Scala编程语言来实现的 - * Java前辈用Java语言实现了雪花算法 - * @Author : Lemon-CS - * @Date : 2022年03月03日 10:33 下午 - */ -public class IdWorker { - - //下面两个每个5位,加起来就是10位的工作机器id - private long workerId; //工作id - private long datacenterId; //数据id - //12位的序列号 - private long sequence; - - public IdWorker(long workerId, long datacenterId, long sequence){ - // sanity check for workerId - if (workerId > maxWorkerId || workerId < 0) { - throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0",maxWorkerId)); - } - if (datacenterId > maxDatacenterId || datacenterId < 0) { - throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0",maxDatacenterId)); - } - System.out.printf("worker starting. timestamp left shift %d, datacenter id bits %d, worker id bits %d, sequence bits %d, workerid %d", - timestampLeftShift, datacenterIdBits, workerIdBits, sequenceBits, workerId); - - this.workerId = workerId; - this.datacenterId = datacenterId; - this.sequence = sequence; - } - - //初始时间戳 - private long twepoch = 1288834974657L; - - //长度为5位 - private long workerIdBits = 5L; - private long datacenterIdBits = 5L; - //最大值 - private long maxWorkerId = -1L ^ (-1L << workerIdBits); - private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); - //序列号id长度 - private long sequenceBits = 12L; - //序列号最大值 - private long sequenceMask = -1L ^ (-1L << sequenceBits); - - //工作id需要左移的位数,12位 - private long workerIdShift = sequenceBits; - //数据id需要左移位数 12+5=17位 - private long datacenterIdShift = sequenceBits + workerIdBits; - //时间戳需要左移位数 12+5+5=22位 - private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; - - //上次时间戳,初始值为负数 - private long lastTimestamp = -1L; - - public long getWorkerId(){ - return workerId; - } - - public long getDatacenterId(){ - return datacenterId; - } - - public long getTimestamp(){ - return System.currentTimeMillis(); - } - - //下一个ID生成算法 - public synchronized long nextId() { - long timestamp = timeGen(); - - //获取当前时间戳如果小于上次时间戳,则表示时间戳获取出现异常 - if (timestamp < lastTimestamp) { - System.err.printf("clock is moving backwards. Rejecting requests until %d.", lastTimestamp); - throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", - lastTimestamp - timestamp)); - } - - //获取当前时间戳如果等于上次时间戳 - //说明:还处在同一毫秒内,则在序列号加1;否则序列号赋值为0,从0开始。 - if (lastTimestamp == timestamp) { // 0 - 4095 - sequence = (sequence + 1) & sequenceMask; - if (sequence == 0) { - timestamp = tilNextMillis(lastTimestamp); - } - } else { - sequence = 0; - } - - //将上次时间戳值刷新 - lastTimestamp = timestamp; - - /** - * 返回结果: - * (timestamp - twepoch) << timestampLeftShift) 表示将时间戳减去初始时间戳,再左移相应位数 - * (datacenterId << datacenterIdShift) 表示将数据id左移相应位数 - * (workerId << workerIdShift) 表示将工作id左移相应位数 - * | 是按位或运算符,例如:x | y,只有当x,y都为0的时候结果才为0,其它情况结果都为1。 - * 因为个部分只有相应位上的值有意义,其它位上都是0,所以将各部分的值进行 | 运算就能得到最终拼接好的id - */ - return ((timestamp - twepoch) << timestampLeftShift) | - (datacenterId << datacenterIdShift) | - (workerId << workerIdShift) | - sequence; - } - - //获取时间戳,并与上次时间戳比较 - private long tilNextMillis(long lastTimestamp) { - long timestamp = timeGen(); - while (timestamp <= lastTimestamp) { - timestamp = timeGen(); - } - return timestamp; - } - - //获取系统时间戳 - private long timeGen(){ - return System.currentTimeMillis(); - } - - - - public static void main(String[] args) { - IdWorker worker = new IdWorker(21,10,0); - for (int i = 0; i < 100; i++) { - System.out.println(worker.nextId()); - } - } - - -} diff --git a/src/main/java/com/fangpeng/globalid/RedisGenerator.java b/src/main/java/com/fangpeng/globalid/RedisGenerator.java deleted file mode 100644 index f371a3f2..00000000 --- a/src/main/java/com/fangpeng/globalid/RedisGenerator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.globalid; - -import redis.clients.jedis.Jedis; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月03日 10:45 下午 - */ -public class RedisGenerator { - - public static void main(String[] args) { - Jedis jedis = new Jedis("127.0.0.1",6379); - for (int i = 0; i < 100; i++) { - Long id = jedis.incr("id");// - System.out.println(id); - } - } - -} diff --git a/src/main/java/com/fangpeng/globalid/UuidTest.java b/src/main/java/com/fangpeng/globalid/UuidTest.java deleted file mode 100644 index 89f7cf77..00000000 --- a/src/main/java/com/fangpeng/globalid/UuidTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.globalid; - -import java.util.UUID; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月03日 10:13 下午 - */ -public class UuidTest { - - public static void main(String[] args) { - String uuid = UUID.randomUUID().toString(); - System.out.println(uuid); - } - -} diff --git a/src/main/java/com/fangpeng/io/aio/chatroom/client/ChatClient.java b/src/main/java/com/fangpeng/io/aio/chatroom/client/ChatClient.java deleted file mode 100644 index 734a74b1..00000000 --- a/src/main/java/com/fangpeng/io/aio/chatroom/client/ChatClient.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.fangpeng.io.aio.chatroom.client; - -import java.io.Closeable; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.AsynchronousSocketChannel; -import java.nio.charset.Charset; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -/** - * @author 方鹏 - * @date 2022年01月19日 9:15 下午 - */ -public class ChatClient { - - private static final String LOCALHOST = "localhost"; - private String host; - private static final int DEFAULT_PORT = 8888; - private int port; - - private static final int BUFFER_SIZE = 1024; - - private static final String QUIT = "\\quit"; - private Charset charset = Charset.forName("UTF-8"); - - private AsynchronousSocketChannel clientChannel; - - public ChatClient() { - this(LOCALHOST, DEFAULT_PORT); - } - - public ChatClient (String host, int port) { - this.host = host; - this.port = port; - } - - public boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - public void close(Closeable closeable) { - if (closeable != null) { - try { - closeable.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - try { - // 创建客户端channel - clientChannel = AsynchronousSocketChannel.open(); - // 连接服务端,异步调用 - Future future = clientChannel.connect(new InetSocketAddress(host, port)); - future.get(); - - // 处理用户输入 - new Thread(new UserInputHandler(this)).start(); - - ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); - - while (true) { - Future readResult = clientChannel.read(buffer); - int result = readResult.get(); - if (result <= 0) { - // 说明出现异常,无法再从服务器得到有效信息 - System.out.println("服务器断开"); - close(clientChannel); - System.exit(1); - - } else { - buffer.flip(); - String msg = String.valueOf(charset.decode(buffer)); - buffer.clear(); - System.out.println(msg); - } - } - - } catch (IOException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - public void send(String msg) { - if (msg.isEmpty()) { - return; - } - ByteBuffer buffer = charset.encode(msg); - Future writeResult = clientChannel.write(buffer); - - try { - writeResult.get(); - } catch (InterruptedException | ExecutionException e) { - System.out.println("发送消息失败"); - e.printStackTrace(); - } - } - - - public static void main(String[] args) { - ChatClient chatClient = new ChatClient(); - chatClient.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/aio/chatroom/client/UserInputHandler.java b/src/main/java/com/fangpeng/io/aio/chatroom/client/UserInputHandler.java deleted file mode 100644 index 4b6e683d..00000000 --- a/src/main/java/com/fangpeng/io/aio/chatroom/client/UserInputHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.io.aio.chatroom.client; - - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:33 下午 - */ -public class UserInputHandler implements Runnable { - - private ChatClient chatClient; - - public UserInputHandler(ChatClient chatClient) { - this.chatClient = chatClient; - } - - @Override - public void run() { - try { - // 等待用户输入消息 - BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); - while (true) { - String input = consoleReader.readLine(); - - // 向服务器发送消息 - chatClient.send(input); - - // 检查用户是否准备退出 - if (chatClient.readyToQuit(input)) { - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/fangpeng/io/aio/chatroom/server/ChatServer.java b/src/main/java/com/fangpeng/io/aio/chatroom/server/ChatServer.java deleted file mode 100644 index 17639d58..00000000 --- a/src/main/java/com/fangpeng/io/aio/chatroom/server/ChatServer.java +++ /dev/null @@ -1,193 +0,0 @@ -package com.fangpeng.io.aio.chatroom.server; - -import java.io.Closeable; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.channels.*; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -/** - * @author 方鹏 - * @date 2022年01月19日 4:04 下午 - */ -public class ChatServer { - - private static final String LOCALHOST = "localhost"; - private static final int DEFAULT_PORT = 8888; - private static final String QUIT = "quit"; - private static final int BUFFER = 1024; - private static final int THREADPOOL_SIZE = 8; - - private AsynchronousServerSocketChannel serverChannel; - private AsynchronousChannelGroup channelGroup; - private List connectedClients; - private Charset charset = Charset.forName("UTF-8"); - private int port; - - public ChatServer() { - this(DEFAULT_PORT); - } - - public ChatServer(int port) { - this.port = port; - this.connectedClients = new ArrayList<>(); - } - - private boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - private void close(Closeable closable) { - if (closable != null) { - try { - closable.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - private String getClientName(AsynchronousSocketChannel clientChannel) { - int clientPort = -1; - try { - InetSocketAddress address = (InetSocketAddress) clientChannel.getRemoteAddress(); - clientPort = address.getPort(); - } catch (IOException e) { - e.printStackTrace(); - } - - return "客户端[" + clientPort + "]"; - } - - private void addClient(ClientHandler handler) { - connectedClients.add(handler); - System.out.println(getClientName(handler.clientChannel) + "已连接"); - } - - private synchronized void removeClient(ClientHandler handler) { - connectedClients.remove(handler); - System.out.println(getClientName(handler.clientChannel) + "已断开"); - close(handler.clientChannel); - } - - private String receive(ByteBuffer buffer) { - CharBuffer charbuffer = charset.decode(buffer); - return String.valueOf(charbuffer); - } - - private void forwardMessage(AsynchronousSocketChannel clientChannel, String fwdMsg) { - - for (ClientHandler handler : connectedClients) { - if (!clientChannel.equals(handler.clientChannel)) { - try { - ByteBuffer buffer = charset.encode(getClientName(clientChannel) + ": " + fwdMsg); - handler.clientChannel.write(buffer, null, handler); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - } - - private void start() { - try { - ExecutorService executorService = Executors.newFixedThreadPool(THREADPOOL_SIZE); - channelGroup = AsynchronousChannelGroup.withThreadPool(executorService); - serverChannel = AsynchronousServerSocketChannel.open(channelGroup); - serverChannel.bind(new InetSocketAddress(LOCALHOST, port)); - System.out.println("启动服务器,监听端口:" + port + "..."); - - while (true) { - serverChannel.accept(null, new AcceptHandler()); - System.in.read(); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(serverChannel); - } - } - - private class AcceptHandler implements CompletionHandler { - - @Override - public void completed(AsynchronousSocketChannel clientChannel, Object attachment) { - // 等待新的客户端连接 - if (serverChannel.isOpen()) { - serverChannel.accept(null, this); - } - - if (clientChannel != null && clientChannel.isOpen()) { - ClientHandler handler = new ClientHandler(clientChannel); - ByteBuffer buffer = ByteBuffer.allocate(BUFFER); - // 将新用户添加到在线用户列表 - addClient(handler); - clientChannel.read(buffer, buffer, handler); - } - - } - - @Override - public void failed(Throwable exc, Object attachment) { - System.out.println("连接失败:" + exc); - } - } - - - private class ClientHandler implements CompletionHandler { - - private AsynchronousSocketChannel clientChannel; - - public ClientHandler(AsynchronousSocketChannel clientChannel) { - this.clientChannel = clientChannel; - } - - @Override - public void completed(Integer result, Object attachment) { - ByteBuffer buffer = (ByteBuffer) attachment; - if (buffer != null) { - if (result <= 0) { - // 客户端异常 - // 将该客户端从在线用户列表当中移除 - System.out.println("客户端异常"); - removeClient(this); - - } else { - buffer.flip(); - String fwdMsg = receive(buffer); - System.out.println(getClientName(clientChannel) + ":" + fwdMsg); - forwardMessage(clientChannel, fwdMsg); - buffer.clear(); - - if (readyToQuit(fwdMsg)) { - // 将该客户端从在线用户列表当中移除 - removeClient(this); - return; - } - - // 持续监听该客户端channel的输入 - clientChannel.read(buffer, buffer, this); - } - } - } - - @Override - public void failed(Throwable exc, Object attachment) { - System.out.println("服务器读取或转发信息失败:" + exc); - } - } - - public static void main(String[] args) { - ChatServer chatServer = new ChatServer(); - chatServer.start(); - } - - -} diff --git a/src/main/java/com/fangpeng/io/aio/demo/Client.java b/src/main/java/com/fangpeng/io/aio/demo/Client.java deleted file mode 100644 index 45c88a40..00000000 --- a/src/main/java/com/fangpeng/io/aio/demo/Client.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.fangpeng.io.aio.demo; - -import java.io.BufferedReader; -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.AsynchronousSocketChannel; -import java.nio.charset.StandardCharsets; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -/** - * @author 方鹏 - * @date 2022年01月19日 1:43 下午 - */ -public class Client { - - final String LOCALHOST = "localhost"; - final int DEFAULT_PORT = 8888; - AsynchronousSocketChannel clientChannel; - - private void close(Closeable closable) { - if (closable != null) { - try { - closable.close(); - System.out.println("关闭" + closable); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - - public void start() { - - try { - // 创建channel - clientChannel = AsynchronousSocketChannel.open(); - Future future = clientChannel.connect(new InetSocketAddress(LOCALHOST, DEFAULT_PORT)); - future.get(); // 阻塞式的调用 - - // 等待用户的输入 - BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); - - while (true) { - String input = consoleReader.readLine(); - - byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8); - ByteBuffer buffer = ByteBuffer.wrap(inputBytes); - Future writeResult = clientChannel.write(buffer); - - writeResult.get(); - buffer.flip(); - Future readResult = clientChannel.read(buffer); - - readResult.get(); - String echo = new String(buffer.array()); - buffer.clear(); - - System.out.println(echo); - - } - - } catch (IOException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - close(clientChannel); - } - } - - public static void main(String[] args) { - Client client = new Client(); - client.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/aio/demo/Server.java b/src/main/java/com/fangpeng/io/aio/demo/Server.java deleted file mode 100644 index 74e13bea..00000000 --- a/src/main/java/com/fangpeng/io/aio/demo/Server.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.fangpeng.io.aio.demo; - -import java.io.Closeable; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.AsynchronousServerSocketChannel; -import java.nio.channels.AsynchronousSocketChannel; -import java.nio.channels.CompletionHandler; -import java.util.HashMap; -import java.util.Map; - -/** - * @author 方鹏 - * @date 2022年01月19日 1:43 下午 - */ -public class Server { - - private static final String LOCALHOST = "localhost"; - private static final int DEFAULT_PORT = 8888; - private static final String QUIT = "quit"; - AsynchronousServerSocketChannel serverChannel; - - - private void close(Closeable closable) { - if (closable != null) { - try { - closable.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - try { - // 绑定监听端口 - // 使用默认的AsynchronousChannelGroup - serverChannel = AsynchronousServerSocketChannel.open(); - serverChannel.bind(new InetSocketAddress(LOCALHOST, DEFAULT_PORT)); - System.out.println("启动服务器,监听端口:" + DEFAULT_PORT); - - while (true) { - serverChannel.accept(null, new AcceptHandler()); - System.in.read(); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(serverChannel); - } - } - - private class AcceptHandler implements CompletionHandler { - - @Override - public void completed(AsynchronousSocketChannel result, Object attachment) { - if (serverChannel.isOpen()) { - serverChannel.accept(null, this); - } - - AsynchronousSocketChannel clientChannel = result; - - if (clientChannel != null && clientChannel.isOpen()) { - ClientHandler handler = new ClientHandler(clientChannel); - - ByteBuffer buffer = ByteBuffer.allocate(1024); - Map info = new HashMap<>(); - info.put("type", "read"); - info.put("buffer", buffer); - - clientChannel.read(buffer, info, handler); - System.out.println("接收到客户端发送的信息"); - } - } - - @Override - public void failed(Throwable exc, Object attachment) { - // 处理错误 - } - } - - private class ClientHandler implements CompletionHandler { - - private AsynchronousSocketChannel clientChannel; - - public ClientHandler(AsynchronousSocketChannel clientChannel) { - this.clientChannel = clientChannel; - } - - @Override - public void completed(Integer result, Object attachment) { - Map info = (Map) attachment; - String type = (String) info.get("type"); - - if ("read".equals(type)) { - ByteBuffer buffer = (ByteBuffer) info.get("buffer"); - buffer.flip(); - info.put("type", "write"); - clientChannel.write(buffer, info, this); - buffer.clear(); - } else if ("write".equals(type)) { - ByteBuffer buffer = ByteBuffer.allocate(1024); - - info.put("type", "read"); - info.put("buffer", buffer); - - clientChannel.read(buffer, info, this); - } - } - - @Override - public void failed(Throwable exc, Object attachment) { - // 处理错误 - } - } - - public static void main(String[] args) { - Server server = new Server(); - server.start(); - } -} diff --git a/src/main/java/com/fangpeng/io/bio/chatroom/client/ChatClient.java b/src/main/java/com/fangpeng/io/bio/chatroom/client/ChatClient.java deleted file mode 100644 index 31123ce1..00000000 --- a/src/main/java/com/fangpeng/io/bio/chatroom/client/ChatClient.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.fangpeng.io.bio.chatroom.client; - -import java.io.*; -import java.net.Socket; - -public class ChatClient { - - private final String DEFAULT_SERVER_HOST = "127.0.0.1"; - private final int DEFAULT_SERVER_PORT = 8888; - private final String QUIT = "quit"; - - private Socket socket; - private BufferedReader reader; - private BufferedWriter writer; - - // 发送消息给服务器 - public void send(String msg) throws IOException { - if (!socket.isOutputShutdown()) { - writer.write(msg + "\n"); - writer.flush(); - } - } - - // 从服务器接收消息 - public String receive() throws IOException { - String msg = null; - if (!socket.isInputShutdown()) { - msg = reader.readLine(); - } - return msg; - } - - // 检查用户是否准备退出 - public boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - public void close() { - if (writer != null) { - try { - System.out.println("关闭socket"); - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - - try { - // 创建socket - socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT); - - // 创建IO流 - reader = new BufferedReader( - new InputStreamReader(socket.getInputStream()) - ); - writer = new BufferedWriter( - new OutputStreamWriter(socket.getOutputStream()) - ); - - // 处理用户的输入 - new Thread(new UserInputHandler(this)).start(); - - // 读取服务器转发的消息 - String msg = null; - while ((msg = receive()) != null) { - System.out.println(msg); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(); - } - } - - public static void main(String[] args) { - ChatClient chatClient = new ChatClient(); - chatClient.start(); - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/io/bio/chatroom/client/UserInputHandler.java b/src/main/java/com/fangpeng/io/bio/chatroom/client/UserInputHandler.java deleted file mode 100644 index 35ba090e..00000000 --- a/src/main/java/com/fangpeng/io/bio/chatroom/client/UserInputHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.fangpeng.io.bio.chatroom.client; - - -import java.io.*; - -public class UserInputHandler implements Runnable { - - private ChatClient chatClient; - - public UserInputHandler(ChatClient chatClient) { - this.chatClient = chatClient; - } - - @Override - public void run() { - try { - // 等待用户输入消息 - BufferedReader consoleReader = - new BufferedReader(new InputStreamReader(System.in)); - while (true) { - String input = consoleReader.readLine(); - - // 向服务器发送消息 - chatClient.send(input); - - // 检查用户是否准备退出 - if (chatClient.readyToQuit(input)) { - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatHandler.java b/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatHandler.java deleted file mode 100644 index c349f2e7..00000000 --- a/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.fangpeng.io.bio.chatroom.server; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.Socket; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:34 下午 - */ -public class ChatHandler implements Runnable { - - private ChatServer server; - private Socket socket; - - public ChatHandler(ChatServer server, Socket socket) { - this.server = server; - this.socket = socket; - } - - @Override - public void run() { - - try { - // 存储新上线用户 - server.addClient(socket); - - // 读取用户发送的消息 - BufferedReader reader = new BufferedReader( - new InputStreamReader(socket.getInputStream())); - - String msg = null; - - while ((msg = reader.readLine()) != null) { - String fwdMsg = "客户端[" + socket.getPort() + "]: " + msg + "\n"; - System.out.print(fwdMsg); - - server.forwardMessage(socket, fwdMsg); - - // 检查用户是否准备退出 - if (server.readyToQuit(msg)) { - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - server.removeClient(socket); - } catch (IOException e) { - e.printStackTrace(); - } - } - - } -} diff --git a/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatServer.java b/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatServer.java deleted file mode 100644 index 09ba9a28..00000000 --- a/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatServer.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.fangpeng.io.bio.chatroom.server; - -import java.io.*; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:34 下午 - */ -public class ChatServer { - - private int DEFAULT_PORT = 8888; - private final String QUIT = "quit"; - - private ServerSocket serverSocket; - private ExecutorService executorService; - private Map connectedClients; - - public ChatServer() { - executorService = Executors.newFixedThreadPool(10); - connectedClients = new HashMap<>(); - } - - public synchronized void addClient(Socket socket) throws IOException { - if (socket != null) { - int port = socket.getPort(); - BufferedWriter writer = new BufferedWriter( - new OutputStreamWriter(socket.getOutputStream())); - - connectedClients.put(port, writer); - System.out.println("客户端[" + port + "]已连接到服务器"); - } - } - - public synchronized void removeClient(Socket socket) throws IOException { - if (socket != null) { - int port = socket.getPort(); - if (connectedClients.containsKey(port)) { - connectedClients.get(port).close(); - } - connectedClients.remove(port); - System.out.println("客户端[" + port + "]已断开连接"); - } - } - - public synchronized void forwardMessage(Socket socket, String fwdMsg) throws IOException { - for (Integer id : connectedClients.keySet()) { - if (!id.equals(socket.getPort())) { - Writer writer = connectedClients.get(id); - writer.write(fwdMsg); - writer.flush(); - } - } - } - - public synchronized void close() { - if (serverSocket != null) { - try { - serverSocket.close(); - System.out.println("关闭serverSocket"); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - - try { - // 绑定监听端口 - serverSocket = new ServerSocket(DEFAULT_PORT); - System.out.println("启动服务器,监听端口:" + DEFAULT_PORT + "..."); - - while (true) { - // 等待客户端连接 - Socket socket = serverSocket.accept(); - // 创建ChatHandler线程 - executorService.execute(new ChatHandler(this, socket)); - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(); - } - } - - public boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - public static void main(String[] args) { - ChatServer server = new ChatServer(); - server.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/ChatClient.java b/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/ChatClient.java deleted file mode 100644 index 6026b8d4..00000000 --- a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/ChatClient.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.fangpeng.io.bio.threadpool.chatroom.client; - -import java.io.*; -import java.net.Socket; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:33 下午 - */ -public class ChatClient { - - private final String DEFAULT_SERVER_HOST = "127.0.0.1"; - private final int DEFAULT_SERVER_PORT = 8888; - private final String QUIT = "quit"; - - private Socket socket; - private BufferedWriter writer; - private BufferedReader reader; - - // 发送消息给服务器 - public void send(String msg) throws IOException { - if (!socket.isOutputShutdown()) { - writer.write(msg + "\n"); - writer.flush(); - } - } - - // 从服务器接收消息 - public String receive() throws IOException { - String msg = null; - if (!socket.isInputShutdown()) { - msg = reader.readLine(); - } - return msg; - } - - // 检查用户是否准备退出 - public boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - public void close() { - if (writer != null) { - try { - System.out.println("关闭socket"); - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - try { - // 创建socket - socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT); - - // 创建IO流 - reader = new BufferedReader( - new InputStreamReader(socket.getInputStream()) - ); - writer = new BufferedWriter( - new OutputStreamWriter(socket.getOutputStream()) - ); - - // 处理用户的输入 - new Thread(new UserInputHandler(this)).start(); - - // 读取服务器转发的消息 - String msg = null; - while ((msg = receive()) != null) { - System.out.println(msg); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(); - } - } - - public static void main(String[] args) { - ChatClient client = new ChatClient(); - client.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/UserInputHandler.java b/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/UserInputHandler.java deleted file mode 100644 index 61945815..00000000 --- a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/UserInputHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.io.bio.threadpool.chatroom.client; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:33 下午 - */ -public class UserInputHandler implements Runnable { - - private ChatClient chatClient; - - public UserInputHandler(ChatClient chatClient) { - this.chatClient = chatClient; - } - - @Override - public void run() { - try { - // 等待用户输入消息 - BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); - while (true) { - String input = consoleReader.readLine(); - - // 向服务器发送消息 - chatClient.send(input); - - // 检查用户是否准备退出 - if (chatClient.readyToQuit(input)) { - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatHandler.java b/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatHandler.java deleted file mode 100644 index f3dfadb9..00000000 --- a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.fangpeng.io.bio.threadpool.chatroom.server; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.Socket; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:34 下午 - */ -public class ChatHandler implements Runnable { - - private ChatServer server; - private Socket socket; - - public ChatHandler(ChatServer server, Socket socket) { - this.server = server; - this.socket = socket; - } - - @Override - public void run() { - - try { - // 存储新上线用户 - server.addClient(socket); - - // 读取用户发送的消息 - BufferedReader reader = new BufferedReader( - new InputStreamReader(socket.getInputStream())); - - String msg = null; - - while ((msg = reader.readLine()) != null) { - String fwdMsg = "客户端[" + socket.getPort() + "]: " + msg + "\n"; - System.out.print(fwdMsg); - - server.forwardMessage(socket, fwdMsg); - - // 检查用户是否准备退出 - if (server.readyToQuit(msg)) { - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - server.removeClient(socket); - } catch (IOException e) { - e.printStackTrace(); - } - } - - } -} diff --git a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatServer.java b/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatServer.java deleted file mode 100644 index f1a9e3c5..00000000 --- a/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatServer.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.fangpeng.io.bio.threadpool.chatroom.server; - -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.HashMap; -import java.util.Map; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:34 下午 - */ -public class ChatServer { - - private int DEFAULT_PORT = 8888; - private final String QUIT = "quit"; - - private ServerSocket serverSocket; - private Map connectedClients; - - public ChatServer() { - connectedClients = new HashMap<>(); - } - - public synchronized void addClient(Socket socket) throws IOException { - if (socket != null) { - int port = socket.getPort(); - BufferedWriter writer = new BufferedWriter( - new OutputStreamWriter(socket.getOutputStream())); - - connectedClients.put(port, writer); - System.out.println("客户端[" + port + "]已连接到服务器"); - } - } - - public synchronized void removeClient(Socket socket) throws IOException { - if (socket != null) { - int port = socket.getPort(); - if (connectedClients.containsKey(port)) { - connectedClients.get(port).close(); - } - connectedClients.remove(port); - System.out.println("客户端[" + port + "]已断开连接"); - } - } - - public synchronized void forwardMessage(Socket socket, String fwdMsg) throws IOException { - for (Integer id : connectedClients.keySet()) { - if (!id.equals(socket.getPort())) { - Writer writer = connectedClients.get(id); - writer.write(fwdMsg); - writer.flush(); - } - } - } - - public synchronized void close() { - if (serverSocket != null) { - try { - serverSocket.close(); - System.out.println("关闭serverSocket"); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - - try { - // 绑定监听端口 - serverSocket = new ServerSocket(DEFAULT_PORT); - System.out.println("启动服务器,监听端口:" + DEFAULT_PORT + "..."); - - while (true) { - // 等待客户端连接 - Socket socket = serverSocket.accept(); - // 创建ChatHandler线程 - new Thread(new ChatHandler(this, socket)).start(); - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(); - } - } - - public boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - public static void main(String[] args) { - ChatServer server = new ChatServer(); - server.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/demo/Client.java b/src/main/java/com/fangpeng/io/demo/Client.java deleted file mode 100644 index 4eea6505..00000000 --- a/src/main/java/com/fangpeng/io/demo/Client.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.fangpeng.io.demo; - -import java.io.*; -import java.net.HttpURLConnection; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * @author 方鹏 - * @date 2022年01月17日 10:32 下午 - */ -public class Client { - - public static void main(String[] args) { - - final String QUIT = "quit"; - final String DEFAULT_SERVER_HOST = "127.0.0.1"; - final int DEFAULT_SERVER_PORT = 8888; - Socket socket = null; - BufferedWriter writer = null; - - try { - // 创建socket - socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT); - - // 创建IO流 - BufferedReader reader = new BufferedReader( - new InputStreamReader(socket.getInputStream())); - - writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); - - // 等待用户输入信息 - BufferedReader consoleReader = - new BufferedReader(new InputStreamReader(System.in)); - - while (true) { - String input = consoleReader.readLine(); - - // 发送消息给服务器 - writer.write(input + "\n"); - writer.flush(); - - // 读取服务器返回的消息 - String msg = reader.readLine(); - System.out.println(msg); - - // 查看用户是否退出 - if (QUIT.equals(input)) { - break; - } - } - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (writer != null) { - try { - writer.close(); - System.out.println("关闭socket"); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - -} diff --git a/src/main/java/com/fangpeng/io/demo/IOClient.java b/src/main/java/com/fangpeng/io/demo/IOClient.java deleted file mode 100644 index e50d2666..00000000 --- a/src/main/java/com/fangpeng/io/demo/IOClient.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.io.demo; - -import java.io.IOException; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.Date; -import java.util.concurrent.TimeUnit; - -/** - * 客户端的代码相对简单,连接上服务端 8000 端口之后,每隔 2 秒,我们向服务端写一个带有时间戳的 "hello world" - * - * @author 方鹏 - * @date 2022年01月14日 4:34 下午 - */ -public class IOClient { - - public static void main(String[] args) { - new Thread(() -> { - try { - Socket socket = new Socket("127.0.0.1", 8000); - while (true) { - try { - socket.getOutputStream().write((new Date() + ": hello world").getBytes()); - TimeUnit.MILLISECONDS.sleep(2000); - } catch (IOException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - }).start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/demo/IOServer.java b/src/main/java/com/fangpeng/io/demo/IOServer.java deleted file mode 100644 index 66882860..00000000 --- a/src/main/java/com/fangpeng/io/demo/IOServer.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.fangpeng.io.demo; - -import java.io.IOException; -import java.io.InputStream; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * Server 端首先创建了一个serverSocket来监听 8000 端口,然后创建一个线程,线程里面不断调用阻塞方法 serversocket.accept(); - * 获取新的连接,当获取到新的连接之后,给每条连接创建一个新的线程,这个线程负责从该连接中读取数据, - * 然后读取数据是以字节流的方式 - * @author 方鹏 - * @date 2022年01月14日 4:16 下午 - */ -public class IOServer { - - public static void main(String[] args) throws IOException { - ServerSocket serverSocket = new ServerSocket(8000); - - // 接收新连接线程 - new Thread(() -> { - while (true) { - // 阻塞方法获取新的连接 - try { - Socket socket = serverSocket.accept(); - - // 每一个新的连接都创建一个线程,负责读取数据 - new Thread(() -> { - try { - int len; - byte[] data = new byte[1024]; - InputStream inputStream = socket.getInputStream(); - // 按字节流方式读取数据 - while ((len = inputStream.read(data)) != -1) { - System.out.println(new String(data, 0, len)); - } - } catch (IOException e) { - e.printStackTrace(); - } - }).start(); - } catch (IOException e) { - e.printStackTrace(); - } - } - }).start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/demo/Server.java b/src/main/java/com/fangpeng/io/demo/Server.java deleted file mode 100644 index 6a1a0a7c..00000000 --- a/src/main/java/com/fangpeng/io/demo/Server.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.fangpeng.io.demo; - -import java.io.*; -import java.net.HttpURLConnection; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author 方鹏 - * @date 2022年01月17日 10:32 下午 - */ -public class Server { - - public static void main(String[] args) { - final String QUIT = "quit"; - final int DEFAULT_PORT = 8888; - ServerSocket serverSocket = null; - - try { - // 绑定监听端口 - serverSocket = new ServerSocket(DEFAULT_PORT); - System.out.println("启动服务器,监听端口" + DEFAULT_PORT); - - while (true) { - // 等待客户端连接 - Socket socket = serverSocket.accept(); - System.out.println("客户端[" + socket.getPort() + "]已连接"); - BufferedReader reader = new BufferedReader( - new InputStreamReader(socket.getInputStream())); - BufferedWriter writer = new BufferedWriter( - new OutputStreamWriter(socket.getOutputStream())); - - // 读取客户端发送的消息 - String msg = null; - while ((msg = reader.readLine()) != null) { - // 读取客户端发送的消息 - System.out.println("客户端[" + socket.getPort() + "]: " + msg); - - // 回复客户发送的消息 - writer.write("服务器: " + msg + "\n"); - writer.flush(); - - // 查看客户端是否退出 - if (QUIT.equals(msg)) { - System.out.println("客户端[" + socket.getPort() + "]已断开连接"); - break; - } - } - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (serverSocket != null) { - try { - serverSocket.close(); - System.out.println("关闭serverSocket"); - } catch (IOException e) { - e.printStackTrace(); - } - - } - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/chatroom/client/ChatClient.java b/src/main/java/com/fangpeng/io/nio/chatroom/client/ChatClient.java deleted file mode 100644 index 0600ab91..00000000 --- a/src/main/java/com/fangpeng/io/nio/chatroom/client/ChatClient.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.fangpeng.io.nio.chatroom.client; - -import java.io.*; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.nio.ByteBuffer; -import java.nio.channels.ClosedSelectorException; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.SocketChannel; -import java.nio.charset.Charset; -import java.util.Map; -import java.util.Set; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:33 下午 - */ -public class ChatClient { - - private static final String DEFAULT_SERVER_HOST = "127.0.0.1"; - private static final int DEFAULT_SERVER_PORT = 8888; - private static final String QUIT = "quit"; - - private static final int BUFFER = 1024; - private String host; - private int port; - private SocketChannel client; - private ByteBuffer rBuffer = ByteBuffer.allocate(BUFFER); - private ByteBuffer wBuffer = ByteBuffer.allocate(BUFFER); - private Selector selector; - private Charset charset = Charset.forName("UTF-8"); - - public ChatClient() { - this(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT); - } - - public ChatClient(String host, int port) { - this.host = host; - this.port = port; - } - - // 发送消息给服务器 - public void send(String msg) throws IOException { - if (msg.isEmpty()) { - return; - } - - wBuffer.clear(); - wBuffer.put(charset.encode(msg)); - wBuffer.flip(); - - while (wBuffer.hasRemaining()) { - client.write(wBuffer); - } - - // 检查用户是否准备退出 - if (readyToQuit(msg)) { - close(selector); - } - - } - - // 从服务器接收消息 - public String receive(SocketChannel client) throws IOException { - rBuffer.clear(); - while (client.read(rBuffer) > 0); - rBuffer.flip(); - return String.valueOf(charset.decode(rBuffer)); - } - - // 检查用户是否准备退出 - public boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - private void close(Closeable closable) { - if (closable != null) { - try { - closable.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void start() { - try { - client = SocketChannel.open(); - client.configureBlocking(false); - - selector = Selector.open(); - client.register(selector, SelectionKey.OP_CONNECT); - client.connect(new InetSocketAddress(host, port)); - - while (true) { - selector.select(); - Set selectionKeys = selector.selectedKeys(); - - for (SelectionKey key : selectionKeys) { - handles(key); - } - selectionKeys.clear(); - } - } catch (IOException e) { - e.printStackTrace(); - } catch (ClosedSelectorException e) { - // 用户正常退出 - } finally { - close(selector); - } - } - - private void handles(SelectionKey key) throws IOException { - - // CONNECT事件 - 连接就绪事件 - if (key.isConnectable()) { - SocketChannel client = (SocketChannel) key.channel(); - if (client.isConnectionPending()) { - client.finishConnect(); - // 处理用户的输入 - new Thread(new UserInputHandler(this)).start(); - } - client.register(selector, SelectionKey.OP_READ); - } - - // READ事件 - 服务器转发消息 - else if (key.isReadable()) { - SocketChannel client = (SocketChannel) key.channel(); - String msg = receive(client); - if (msg.isEmpty()) { - // 服务器异常 - close(selector); - } else { - System.out.println(msg); - } - } - } - - public static void main(String[] args) { - ChatClient client = new ChatClient("127.0.0.1", 7777); - client.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/chatroom/client/UserInputHandler.java b/src/main/java/com/fangpeng/io/nio/chatroom/client/UserInputHandler.java deleted file mode 100644 index 79618daf..00000000 --- a/src/main/java/com/fangpeng/io/nio/chatroom/client/UserInputHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fangpeng.io.nio.chatroom.client; - -import java.io.*; - -/** - * @author 方鹏 - * @date 2022年01月17日 11:33 下午 - */ -public class UserInputHandler implements Runnable { - - private ChatClient chatClient; - - public UserInputHandler(ChatClient chatClient) { - this.chatClient = chatClient; - } - - @Override - public void run() { - try { - // 等待用户输入消息 - BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); - while (true) { - String input = consoleReader.readLine(); - - // 向服务器发送消息 - chatClient.send(input); - - // 检查用户是否准备退出 - if (chatClient.readyToQuit(input)) { - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/fangpeng/io/nio/chatroom/server/ChatServer.java b/src/main/java/com/fangpeng/io/nio/chatroom/server/ChatServer.java deleted file mode 100644 index 90ce4069..00000000 --- a/src/main/java/com/fangpeng/io/nio/chatroom/server/ChatServer.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.fangpeng.io.nio.chatroom.server; - -import java.io.Closeable; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.*; -import java.nio.charset.Charset; -import java.util.Set; - -/** - * @author 方鹏 - * @date 2022年01月19日 10:04 上午 - */ -public class ChatServer { - - private static final int DEFAULT_PORT = 8888; - private static final String QUIT = "quit"; - private static final int BUFFER = 1024; - - private ServerSocketChannel server; - private Selector selector; - private ByteBuffer rBuffer = ByteBuffer.allocate(BUFFER); - private ByteBuffer wBuffer = ByteBuffer.allocate(BUFFER); - private Charset charset = Charset.forName("UTF-8"); - private int port; - - public ChatServer() { - this(DEFAULT_PORT); - } - - public ChatServer(int port) { - this.port = port; - } - - private void start() { - try { - server = ServerSocketChannel.open(); - // 默认是阻塞的,设置成非阻塞 - server.configureBlocking(false); - server.socket().bind(new InetSocketAddress(port)); - - selector = Selector.open(); - server.register(selector, SelectionKey.OP_ACCEPT); - System.out.println("启动服务器, 监听端口:" + port + "..."); - - // select是阻塞的 - while (true) { - selector.select(); - Set selectionKeys = selector.selectedKeys(); - for (SelectionKey key : selectionKeys) { - // 处理被触发的事件 - handles(key); - } - selectionKeys.clear(); - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(selector); - } - } - - private void handles(SelectionKey key) throws IOException { - - // ACCEPT事件 - 和客户端建立了连接 - if (key.isAcceptable()) { - ServerSocketChannel server = (ServerSocketChannel) key.channel(); - // 获取客户端的连接Channel - SocketChannel client = server.accept(); - client.configureBlocking(false); - client.register(selector, SelectionKey.OP_READ); - System.out.println(getClientName(client) + "已连接"); - } - - // READ事件 - 客户端发送了消息 - else if (key.isReadable()) { - SocketChannel client = (SocketChannel) key.channel(); - String fwdMsg = receive(client); - if (fwdMsg.isEmpty()) { - // 客户端异常 - key.cancel(); - selector.wakeup(); - } else { - System.out.println(getClientName(client) + ":" + fwdMsg); - forwardMessage(client, fwdMsg); - - // 检查用户是否退出 - if (readyToQuit(fwdMsg)) { - key.cancel(); - selector.wakeup(); - System.out.println(getClientName(client) + "已断开"); - } - } - - } - } - - private void forwardMessage(SocketChannel client, String fwdMsg) throws IOException { - for (SelectionKey key : selector.keys()) { - Channel connectedClient = key.channel(); - if (connectedClient instanceof ServerSocketChannel) { - continue; - } - - if (key.isValid() && !client.equals(connectedClient)) { - wBuffer.clear(); - wBuffer.put(charset.encode(getClientName(client) + ":" + fwdMsg)); - wBuffer.flip(); - while (wBuffer.hasRemaining()) { - ((SocketChannel)connectedClient).write(wBuffer); - } - } - } - } - - private String receive(SocketChannel client) throws IOException { - rBuffer.clear(); - while (client.read(rBuffer) > 0); - rBuffer.flip(); - return String.valueOf(charset.decode(rBuffer)); - } - - - private boolean readyToQuit(String msg) { - return QUIT.equals(msg); - } - - private void close(Closeable closable) { - if (closable != null) { - try { - closable.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - private String getClientName(SocketChannel client) { - return "客户端[" + client.socket().getPort() + "]"; - } - - public static void main(String[] args) { - ChatServer chatServer = new ChatServer(7777); - chatServer.start(); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/NIOServer.java b/src/main/java/com/fangpeng/io/nio/demo/NIOServer.java deleted file mode 100644 index 576a3e95..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/NIOServer.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.fangpeng.io.nio.demo; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -import java.nio.charset.Charset; -import java.util.Iterator; -import java.util.Set; - -/** - * @author 方鹏 - * @date 2022年01月20日 10:51 下午 - */ -public class NIOServer { - public static void main(String[] args) throws IOException { - Selector serverSelector = Selector.open(); - Selector clientSelector = Selector.open(); - - new Thread(() -> { - try { - // 对应IO编程中服务端启动 - ServerSocketChannel listenerChannel = ServerSocketChannel.open(); - listenerChannel.socket().bind(new InetSocketAddress(8000)); - listenerChannel.configureBlocking(false); - listenerChannel.register(serverSelector, SelectionKey.OP_ACCEPT); - - while (true) { - // 监测是否有新的连接,这里的1指的是阻塞的时间为 1ms - if (serverSelector.select(1) > 0) { - Set set = serverSelector.selectedKeys(); - Iterator keyIterator = set.iterator(); - - while (keyIterator.hasNext()) { - SelectionKey key = keyIterator.next(); - - if (key.isAcceptable()) { - try { - // (1) 每来一个新连接,不需要创建一个线程,而是直接注册到clientSelector - SocketChannel clientChannel = ((ServerSocketChannel) key.channel()).accept(); - clientChannel.configureBlocking(false); - clientChannel.register(clientSelector, SelectionKey.OP_READ); - } finally { - keyIterator.remove(); - } - } - - } - } - } - } catch (IOException ignored) { - } - - }).start(); - - - new Thread(() -> { - try { - while (true) { - // (2) 批量轮询是否有哪些连接有数据可读,这里的1指的是阻塞的时间为 1ms - if (clientSelector.select(1) > 0) { - Set set = clientSelector.selectedKeys(); - Iterator keyIterator = set.iterator(); - - while (keyIterator.hasNext()) { - SelectionKey key = keyIterator.next(); - - if (key.isReadable()) { - try { - SocketChannel clientChannel = (SocketChannel) key.channel(); - ByteBuffer byteBuffer = ByteBuffer.allocate(1024); - // (3) 面向 Buffer - clientChannel.read(byteBuffer); - byteBuffer.flip(); - System.out.println(Charset.defaultCharset().newDecoder().decode(byteBuffer) - .toString()); - } finally { - keyIterator.remove(); - key.interestOps(SelectionKey.OP_READ); - } - } - - } - } - } - } catch (IOException ignored) { - } - }).start(); - - - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferAllocate.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferAllocate.java deleted file mode 100644 index 381fbc94..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferAllocate.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.nio.ByteBuffer; - -/** - * @author 方鹏 - * @date 2022年01月23日 5:33 下午 - */ -public class ByteBufferAllocate { - - public static void main(String[] args) { - System.out.println(ByteBuffer.allocate(16).getClass()); - System.out.println(ByteBuffer.allocateDirect(16).getClass()); - /* - class java.nio.HeapByteBuffer - java 堆内存,读写效率较低,受到 GC 的影响 - class java.nio.DirectByteBuffer - 直接内存,读写效率高(少一次拷贝),不会受 GC 影响,分配的效率低 - */ - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferDemo.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferDemo.java deleted file mode 100644 index 7a246054..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferDemo.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import lombok.extern.slf4j.Slf4j; - -import java.io.FileInputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; - -/** - * @author 方鹏 - * @date 2022年01月23日 5:25 下午 - */ -@Slf4j -public class ByteBufferDemo { - - public static void main(String[] args) { - // FileChannel - // 1. 输入输出流, 2. RandomAccessFile - try (FileChannel channel = new FileInputStream("data.txt").getChannel()) { - // 准备缓冲区 - ByteBuffer buffer = ByteBuffer.allocate(10); - while(true) { - // 从 channel 读取数据,向 buffer 写入 - int len = channel.read(buffer); - log.debug("读取到的字节数 {}", len); - if(len == -1) { // 没有内容了 - break; - } - // 打印 buffer 的内容 - buffer.flip(); // 切换至读模式 - while(buffer.hasRemaining()) { // 是否还有剩余未读数据 - byte b = buffer.get(); - log.debug("实际字节 {}", (char) b); - } - buffer.clear(); // 切换为写模式 - } - } catch (IOException e) { - e.printStackTrace(); - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferExam.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferExam.java deleted file mode 100644 index ab4cf412..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferExam.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.nio.ByteBuffer; - -import static com.fangpeng.io.nio.demo.bytebuffer.ByteBufferUtil.debugAll; - -/** - * @author 方鹏 - * @date 2022年01月23日 6:07 下午 - */ -public class ByteBufferExam { - - /* - * 网络上有多条数据发送给服务端,数据之间使用 \n 进行分隔 - * 但由于某种原因这些数据在接收时,被进行了重新组合,例如原始数据有3条为 - * Hello,world\n - * I'm zhangsan\n - * How are you?\n - * 变成了下面的两个 byteBuffer (黏包,半包) - * Hello,world\nI'm zhangsan\nHo - * w are you?\n - * 现在要求你编写程序,将错乱的数据恢复成原始的按 \n 分隔的数据 - * @author 方鹏 - * @date 2022/1/23 6:08 下午 - * @param args - */ - public static void main(String[] args) { - ByteBuffer source = ByteBuffer.allocate(32); - source.put("Hello,world\nI'm zhangsan\nHo".getBytes()); - split(source); - source.put("w are you?\n".getBytes()); - split(source); - } - - private static void split(ByteBuffer source) { - source.flip(); - for (int i = 0; i < source.limit(); i++) { - // 找到一条完整消息 - if (source.get(i) == '\n') { - int length = i + 1 - source.position(); - // 把这条完整消息存入新的 ByteBuffer - ByteBuffer target = ByteBuffer.allocate(length); - // 从 source 读,向 target 写 - for (int j = 0; j < length; j++) { - target.put(source.get()); - } - debugAll(target); - } - } - source.compact(); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferRead.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferRead.java deleted file mode 100644 index b2fb0ad9..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferRead.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.nio.ByteBuffer; - -import static com.fangpeng.io.nio.demo.bytebuffer.ByteBufferUtil.debugAll; - -/** - * @author 方鹏 - * @date 2022年01月23日 5:43 下午 - */ -public class ByteBufferRead { - - public static void main(String[] args) { - ByteBuffer buffer = ByteBuffer.allocate(10); - buffer.put(new byte[]{'a', 'b', 'c', 'd'}); - buffer.flip(); - - // rewind 从头开始读 - //buffer.get(new byte[4]); - //debugAll(buffer); - //buffer.rewind(); - //System.out.println((char)buffer.get()); - - // mark & reset - // mark 做一个标记,记录 position 位置, reset 是将 position 重置到 mark 的位置 - //System.out.println((char) buffer.get()); - //System.out.println((char) buffer.get()); - //buffer.mark(); // 加标记,索引2 的位置 - //System.out.println((char) buffer.get()); - //System.out.println((char) buffer.get()); - //buffer.reset(); // 将 position 重置到索引 2 - //System.out.println((char) buffer.get()); - //System.out.println((char) buffer.get()); - - // get(i) 不会改变读索引的位置 - System.out.println((char) buffer.get(3)); - debugAll(buffer); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferReadWrite.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferReadWrite.java deleted file mode 100644 index cd851bab..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferReadWrite.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.nio.ByteBuffer; - -import static com.fangpeng.io.nio.demo.bytebuffer.ByteBufferUtil.debugAll; - -/** - * @author 方鹏 - * @date 2022年01月23日 5:27 下午 - */ -public class ByteBufferReadWrite { - - public static void main(String[] args) { - ByteBuffer buffer = ByteBuffer.allocate(10); - buffer.put((byte) 0x61); // 'a' - debugAll(buffer); - buffer.put(new byte[]{0x62, 0x63, 0x64}); // b c d - debugAll(buffer); -// System.out.println(buffer.get()); - buffer.flip(); - System.out.println(buffer.get()); - debugAll(buffer); - buffer.compact(); - debugAll(buffer); - buffer.put(new byte[]{0x65, 0x66}); - debugAll(buffer); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferString.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferString.java deleted file mode 100644 index 361c4b4b..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferString.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; - -import static com.fangpeng.io.nio.demo.bytebuffer.ByteBufferUtil.debugAll; - -/** - * @author 方鹏 - * @date 2022年01月23日 5:55 下午 - */ -public class ByteBufferString { - - public static void main(String[] args) { - // 1. 字符串转为 ByteBuffer - ByteBuffer buffer1 = ByteBuffer.allocate(16); - buffer1.put("hello".getBytes()); - debugAll(buffer1); - - // 2. Charset - ByteBuffer buffer2 = StandardCharsets.UTF_8.encode("hello"); - debugAll(buffer2); - - // 3. wrap - ByteBuffer buffer3 = ByteBuffer.wrap("hello".getBytes()); - debugAll(buffer3); - - // 4. 转为字符串 - String str1 = StandardCharsets.UTF_8.decode(buffer2).toString(); - System.out.println(str1); - - buffer1.flip(); - String str2 = StandardCharsets.UTF_8.decode(buffer1).toString(); - System.out.println(str2); - - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferUtil.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferUtil.java deleted file mode 100644 index 0baf397e..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ByteBufferUtil.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import io.netty.util.internal.StringUtil; - -import java.nio.ByteBuffer; -import static io.netty.util.internal.MathUtil.isOutOfBounds; -import static io.netty.util.internal.StringUtil.NEWLINE; - -/** - * @author 方鹏 - * @date 2022年01月23日 5:26 下午 - */ -public class ByteBufferUtil { - - private static final char[] BYTE2CHAR = new char[256]; - private static final char[] HEXDUMP_TABLE = new char[256 * 4]; - private static final String[] HEXPADDING = new String[16]; - private static final String[] HEXDUMP_ROWPREFIXES = new String[65536 >>> 4]; - private static final String[] BYTE2HEX = new String[256]; - private static final String[] BYTEPADDING = new String[16]; - - static { - final char[] DIGITS = "0123456789abcdef".toCharArray(); - for (int i = 0; i < 256; i++) { - HEXDUMP_TABLE[i << 1] = DIGITS[i >>> 4 & 0x0F]; - HEXDUMP_TABLE[(i << 1) + 1] = DIGITS[i & 0x0F]; - } - - int i; - - // Generate the lookup table for hex dump paddings - for (i = 0; i < HEXPADDING.length; i++) { - int padding = HEXPADDING.length - i; - StringBuilder buf = new StringBuilder(padding * 3); - for (int j = 0; j < padding; j++) { - buf.append(" "); - } - HEXPADDING[i] = buf.toString(); - } - - // Generate the lookup table for the start-offset header in each row (up to 64KiB). - for (i = 0; i < HEXDUMP_ROWPREFIXES.length; i++) { - StringBuilder buf = new StringBuilder(12); - buf.append(NEWLINE); - buf.append(Long.toHexString(i << 4 & 0xFFFFFFFFL | 0x100000000L)); - buf.setCharAt(buf.length() - 9, '|'); - buf.append('|'); - HEXDUMP_ROWPREFIXES[i] = buf.toString(); - } - - // Generate the lookup table for byte-to-hex-dump conversion - for (i = 0; i < BYTE2HEX.length; i++) { - BYTE2HEX[i] = ' ' + StringUtil.byteToHexStringPadded(i); - } - - // Generate the lookup table for byte dump paddings - for (i = 0; i < BYTEPADDING.length; i++) { - int padding = BYTEPADDING.length - i; - StringBuilder buf = new StringBuilder(padding); - for (int j = 0; j < padding; j++) { - buf.append(' '); - } - BYTEPADDING[i] = buf.toString(); - } - - // Generate the lookup table for byte-to-char conversion - for (i = 0; i < BYTE2CHAR.length; i++) { - if (i <= 0x1f || i >= 0x7f) { - BYTE2CHAR[i] = '.'; - } else { - BYTE2CHAR[i] = (char) i; - } - } - } - - /** - * 打印所有内容 - * @param buffer - */ - public static void debugAll(ByteBuffer buffer) { - int oldlimit = buffer.limit(); - buffer.limit(buffer.capacity()); - StringBuilder origin = new StringBuilder(256); - appendPrettyHexDump(origin, buffer, 0, buffer.capacity()); - System.out.println("+--------+-------------------- all ------------------------+----------------+"); - System.out.printf("position: [%d], limit: [%d]\n", buffer.position(), oldlimit); - System.out.println(origin); - buffer.limit(oldlimit); - } - - /** - * 打印可读取内容 - * @param buffer - */ - public static void debugRead(ByteBuffer buffer) { - StringBuilder builder = new StringBuilder(256); - appendPrettyHexDump(builder, buffer, buffer.position(), buffer.limit() - buffer.position()); - System.out.println("+--------+-------------------- read -----------------------+----------------+"); - System.out.printf("position: [%d], limit: [%d]\n", buffer.position(), buffer.limit()); - System.out.println(builder); - } - - public static void main(String[] args) { - ByteBuffer buffer = ByteBuffer.allocate(10); - buffer.put(new byte[]{97, 98, 99, 100}); - debugAll(buffer); - } - - private static void appendPrettyHexDump(StringBuilder dump, ByteBuffer buf, int offset, int length) { - if (isOutOfBounds(offset, length, buf.capacity())) { - throw new IndexOutOfBoundsException( - "expected: " + "0 <= offset(" + offset + ") <= offset + length(" + length - + ") <= " + "buf.capacity(" + buf.capacity() + ')'); - } - if (length == 0) { - return; - } - dump.append( - " +-------------------------------------------------+" + - NEWLINE + " | 0 1 2 3 4 5 6 7 8 9 a b c d e f |" + - NEWLINE + "+--------+-------------------------------------------------+----------------+"); - - final int startIndex = offset; - final int fullRows = length >>> 4; - final int remainder = length & 0xF; - - // Dump the rows which have 16 bytes. - for (int row = 0; row < fullRows; row++) { - int rowStartIndex = (row << 4) + startIndex; - - // Per-row prefix. - appendHexDumpRowPrefix(dump, row, rowStartIndex); - - // Hex dump - int rowEndIndex = rowStartIndex + 16; - for (int j = rowStartIndex; j < rowEndIndex; j++) { - dump.append(BYTE2HEX[getUnsignedByte(buf, j)]); - } - dump.append(" |"); - - // ASCII dump - for (int j = rowStartIndex; j < rowEndIndex; j++) { - dump.append(BYTE2CHAR[getUnsignedByte(buf, j)]); - } - dump.append('|'); - } - - // Dump the last row which has less than 16 bytes. - if (remainder != 0) { - int rowStartIndex = (fullRows << 4) + startIndex; - appendHexDumpRowPrefix(dump, fullRows, rowStartIndex); - - // Hex dump - int rowEndIndex = rowStartIndex + remainder; - for (int j = rowStartIndex; j < rowEndIndex; j++) { - dump.append(BYTE2HEX[getUnsignedByte(buf, j)]); - } - dump.append(HEXPADDING[remainder]); - dump.append(" |"); - - // Ascii dump - for (int j = rowStartIndex; j < rowEndIndex; j++) { - dump.append(BYTE2CHAR[getUnsignedByte(buf, j)]); - } - dump.append(BYTEPADDING[remainder]); - dump.append('|'); - } - - dump.append(NEWLINE + - "+--------+-------------------------------------------------+----------------+"); - } - - private static void appendHexDumpRowPrefix(StringBuilder dump, int row, int rowStartIndex) { - if (row < HEXDUMP_ROWPREFIXES.length) { - dump.append(HEXDUMP_ROWPREFIXES[row]); - } else { - dump.append(NEWLINE); - dump.append(Long.toHexString(rowStartIndex & 0xFFFFFFFFL | 0x100000000L)); - dump.setCharAt(dump.length() - 9, '|'); - dump.append('|'); - } - } - - public static short getUnsignedByte(ByteBuffer buffer, int index) { - return (short) (buffer.get(index) & 0xFF); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/GatheringWrites.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/GatheringWrites.java deleted file mode 100644 index 28faa0db..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/GatheringWrites.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.charset.StandardCharsets; - -/** - * 多个buffer数据写到一个文件中 - * @author 方鹏 - * @date 2022年01月23日 6:05 下午 - */ -public class GatheringWrites { - - public static void main(String[] args) { - ByteBuffer b1 = StandardCharsets.UTF_8.encode("hello"); - ByteBuffer b2 = StandardCharsets.UTF_8.encode("world"); - ByteBuffer b3 = StandardCharsets.UTF_8.encode("你好"); - - try (FileChannel channel = new RandomAccessFile("words2.txt", "rw").getChannel()) { - channel.write(new ByteBuffer[]{b1, b2, b3}); - } catch (IOException e) { - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ScatteringReads.java b/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ScatteringReads.java deleted file mode 100644 index 7968bf57..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/bytebuffer/ScatteringReads.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.fangpeng.io.nio.demo.bytebuffer; - -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; - -import static com.fangpeng.io.nio.demo.bytebuffer.ByteBufferUtil.debugAll; - -/** - * 数据分散读取 - * @author 方鹏 - * @date 2022年01月23日 6:03 下午 - */ -public class ScatteringReads { - - public static void main(String[] args) { - try (FileChannel channel = new RandomAccessFile("words.txt", "r").getChannel()) { - ByteBuffer b1 = ByteBuffer.allocate(3); - ByteBuffer b2 = ByteBuffer.allocate(3); - ByteBuffer b3 = ByteBuffer.allocate(5); - channel.read(new ByteBuffer[]{b1, b2, b3}); - b1.flip(); - b2.flip(); - b3.flip(); - debugAll(b1); - debugAll(b2); - debugAll(b3); - } catch (IOException e) { - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/file/FileChannelTransferTo.java b/src/main/java/com/fangpeng/io/nio/demo/file/FileChannelTransferTo.java deleted file mode 100644 index 6d00435c..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/file/FileChannelTransferTo.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fangpeng.io.nio.demo.file; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.channels.FileChannel; - -/** - * @author 方鹏 - * @date 2022年01月23日 6:26 下午 - */ -public class FileChannelTransferTo { - - public static void main(String[] args) { - try ( - FileChannel from = new FileInputStream("data.txt").getChannel(); - FileChannel to = new FileOutputStream("to.txt").getChannel(); - ) { - // 效率高,底层会利用操作系统的零拷贝进行优化, 大于2g 数据分批次传输 - long size = from.size(); - // left 变量代表还剩余多少字节 - for (long left = size; left > 0; ) { - System.out.println("position:" + (size - left) + " left:" + left); - left -= from.transferTo((size - left), left, to); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/file/FilesCopy.java b/src/main/java/com/fangpeng/io/nio/demo/file/FilesCopy.java deleted file mode 100644 index c4bdfc2e..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/file/FilesCopy.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fangpeng.io.nio.demo.file; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; - -/** - * @author 方鹏 - * @date 2022年01月23日 6:36 下午 - */ -public class FilesCopy { - - public static void main(String[] args) throws IOException { - long start = System.currentTimeMillis(); - String source = "D:\\Snipaste-1.16.2-x64"; - String target = "D:\\Snipaste-1.16.2-x64aaa"; - - Files.walk(Paths.get(source)).forEach(path -> { - try { - String targetName = path.toString().replace(source, target); - // 是目录 - if (Files.isDirectory(path)) { - Files.createDirectory(Paths.get(targetName)); - } - // 是普通文件 - else if (Files.isRegularFile(path)) { - Files.copy(path, Paths.get(targetName)); - } - } catch (IOException e) { - e.printStackTrace(); - } - }); - long end = System.currentTimeMillis(); - System.out.println(end - start); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/file/FilesWalkFileTree.java b/src/main/java/com/fangpeng/io/nio/demo/file/FilesWalkFileTree.java deleted file mode 100644 index d619610d..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/file/FilesWalkFileTree.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.fangpeng.io.nio.demo.file; - -import java.io.IOException; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * 遍历文件夹 - * @author 方鹏 - * @date 2022年01月23日 6:37 下午 - */ -public class FilesWalkFileTree { - - public static void main(String[] args) throws IOException { -// Files.delete(Paths.get("/Users/fangpeng/Downloads/netty-demo")); - Files.walkFileTree(Paths.get("/Users/fangpeng/Downloads/netty-demo"), new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - Files.delete(file); - return super.visitFile(file, attrs); - } - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - Files.delete(dir); - return super.postVisitDirectory(dir, exc); - } - }); - } - - private static void m2() throws IOException { - AtomicInteger javaCount = new AtomicInteger(); - Files.walkFileTree(Paths.get("/Users/fangpeng/Downloads/netty-demo"), new SimpleFileVisitor(){ - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - if (file.toString().endsWith(".java")) { - System.out.println(file); - javaCount.incrementAndGet(); - } - return super.visitFile(file, attrs); - } - }); - System.out.println("java count:" + javaCount); - } - - private static void m1() throws IOException { - AtomicInteger dirCount = new AtomicInteger(); - AtomicInteger fileCount = new AtomicInteger(); - Files.walkFileTree(Paths.get("/Users/fangpeng/Downloads/netty-demo"), new SimpleFileVisitor(){ - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { - System.out.println("====>"+dir); - dirCount.incrementAndGet(); - return super.preVisitDirectory(dir, attrs); - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - System.out.println(file); - fileCount.incrementAndGet(); - return super.visitFile(file, attrs); - } - }); - System.out.println("dir count:" +dirCount); - System.out.println("file count:" +fileCount); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/net/Client.java b/src/main/java/com/fangpeng/io/nio/demo/net/Client.java deleted file mode 100644 index 05ec1295..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/net/Client.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.io.nio.demo.net; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.nio.channels.SocketChannel; - -/** - * @author 方鹏 - * @date 2022年01月23日 9:39 下午 - */ -public class Client { - - public static void main(String[] args) throws IOException { - SocketChannel sc = SocketChannel.open(); - sc.connect(new InetSocketAddress("localhost", 8080)); - SocketAddress address = sc.getLocalAddress(); - System.out.println("waiting..."); -// sc.close(); - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/net/MultiThreadServer.java b/src/main/java/com/fangpeng/io/nio/demo/net/MultiThreadServer.java deleted file mode 100644 index 7835cf02..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/net/MultiThreadServer.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.fangpeng.io.nio.demo.net; - -import lombok.extern.slf4j.Slf4j; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -import java.util.Iterator; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicInteger; - -import static com.fangpeng.io.nio.demo.bytebuffer.ByteBufferUtil.debugAll; - -/** - * @author 方鹏 - * @date 2022年01月23日 10:52 下午 - */ -@Slf4j -public class MultiThreadServer { - - public static void main(String[] args) throws IOException { - Thread.currentThread().setName("boss"); - ServerSocketChannel ssc = ServerSocketChannel.open(); - ssc.configureBlocking(false); - Selector boss = Selector.open(); - SelectionKey bossKey = ssc.register(boss, 0, null); - bossKey.interestOps(SelectionKey.OP_ACCEPT); - ssc.bind(new InetSocketAddress(8080)); - // 1. 创建固定数量的 worker 并初始化 - Worker[] workers = new Worker[Runtime.getRuntime().availableProcessors()]; - for (int i = 0; i < workers.length; i++) { - workers[i] = new Worker("worker-" + i); - } - AtomicInteger index = new AtomicInteger(); - - while (true) { - boss.select(); - Iterator iter = boss.selectedKeys().iterator(); - while (iter.hasNext()) { - SelectionKey key = iter.next(); - iter.remove(); - if (key.isAcceptable()) { - SocketChannel sc = ssc.accept(); - sc.configureBlocking(false); - log.debug("connected...{}", sc.getRemoteAddress()); - // 2. 关联 selector - log.debug("before register...{}", sc.getRemoteAddress()); - // round robin 轮询 - workers[index.getAndIncrement() % workers.length].register(sc); // boss 调用 初始化 selector , 启动 worker-0 - log.debug("after register...{}", sc.getRemoteAddress()); - } - } - } - } - - static class Worker implements Runnable { - - private Thread thread; - private Selector selector; - private String name; - private volatile boolean start = false; // 还未初始化 - private ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); - public Worker(String name) { - this.name = name; - } - - // 初始化线程,和 selector - public void register(SocketChannel sc) throws IOException { - if(!start) { - selector = Selector.open(); - thread = new Thread(this, name); - thread.start(); - start = true; - } - selector.wakeup(); // 唤醒 select 方法 boss - sc.register(selector, SelectionKey.OP_READ, null); // boss - } - - @Override - public void run() { - while (true) { - try { - selector.select(); - - Iterator iter = selector.selectedKeys().iterator(); - while (iter.hasNext()) { - SelectionKey key = iter.next(); - iter.remove(); - if (key.isReadable()) { - ByteBuffer buffer = ByteBuffer.allocate(16); - SocketChannel channel = (SocketChannel) key.channel(); - log.debug("read...{}", channel.getRemoteAddress()); - channel.read(buffer); - buffer.flip(); - debugAll(buffer); - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/net/Server.java b/src/main/java/com/fangpeng/io/nio/demo/net/Server.java deleted file mode 100644 index 146795e8..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/net/Server.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.fangpeng.io.nio.demo.net; - -import lombok.extern.slf4j.Slf4j; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -import java.nio.charset.Charset; -import java.util.Iterator; -import java.util.Set; - -/** - * @author 方鹏 - * @date 2022年01月23日 6:50 下午 - */ -@Slf4j -public class Server { - - public static void main(String[] args) throws IOException { - // 1. 创建 selector, 管理多个 channel - Selector selector = Selector.open(); - ServerSocketChannel server = ServerSocketChannel.open(); - server.configureBlocking(false); - - // 2. 建立 selector 和 channel 的联系(注册) - // SelectionKey 就是将来事件发生后,通过它可以知道事件和哪个channel的事件 - // key 只关注 accept 事件 - SelectionKey selectionKey = server.register(selector, SelectionKey.OP_ACCEPT); - - log.debug("selectionKey:{}", selectionKey); - server.bind(new InetSocketAddress(8080)); - - while (true) { - // 3. select 方法, 没有事件发生,线程阻塞,有事件,线程才会恢复运行 - // select 在事件未处理时,它不会阻塞, 事件发生后要么处理,要么取消,不能置之不理 - selector.select(); - - // 4. 处理事件, selectedKeys 内部包含了所有发生的事件 - Iterator iterator = selector.selectedKeys().iterator(); - - while (iterator.hasNext()) { - SelectionKey key = iterator.next(); - - // 处理key 时,要从 selectedKeys 集合中删除,否则下次处理就会有问题 - iterator.remove(); - log.debug("key: {}", key); - // 5. 区分事件类型 - if (key.isAcceptable()) { // 如果是 accept - ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel(); - SocketChannel sc = serverChannel.accept(); - sc.configureBlocking(false); - ByteBuffer buffer = ByteBuffer.allocate(16); - // 将一个ByteBuffer作为附件关联到selectionKey - SelectionKey scKey = sc.register(selector, 0, buffer); - scKey.interestOps(SelectionKey.OP_READ); - log.debug("{}", sc); - log.debug("scKey:{}", scKey); - } else if (key.isReadable()) { // 如果是 read - try { - SocketChannel channel = (SocketChannel) key.channel(); // 拿到触发事件的channel - ByteBuffer buffer = (ByteBuffer) key.attachment(); - int read = channel.read(buffer); // 如果是正常断开,read 的方法的返回值是 -1 - if (read == -1) { - key.cancel(); - } else { - buffer.flip(); -// debugAll(buffer); - System.out.println(Charset.defaultCharset().decode(buffer)); - } - } catch (IOException e) { - e.printStackTrace(); - key.cancel(); // 因为客户端断开了,因此需要将 key 取消(从 selector 的 keys 集合中真正删除 key) - } - } - } - - - } - - - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/net/WriteClient.java b/src/main/java/com/fangpeng/io/nio/demo/net/WriteClient.java deleted file mode 100644 index 74a61e57..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/net/WriteClient.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.fangpeng.io.nio.demo.net; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SocketChannel; - -/** - * @author 方鹏 - * @date 2022年01月23日 10:36 下午 - */ -public class WriteClient { - - public static void main(String[] args) throws IOException { - SocketChannel sc = SocketChannel.open(); - sc.connect(new InetSocketAddress("localhost", 8080)); - - // 3. 接收数据 - int count = 0; - while (true) { - ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); - count += sc.read(buffer); - System.out.println(count); - buffer.clear(); - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/demo/net/WriteServer.java b/src/main/java/com/fangpeng/io/nio/demo/net/WriteServer.java deleted file mode 100644 index 818d20e3..00000000 --- a/src/main/java/com/fangpeng/io/nio/demo/net/WriteServer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.fangpeng.io.nio.demo.net; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -import java.nio.charset.Charset; -import java.util.Iterator; - -/** - * @author 方鹏 - * @date 2022年01月23日 10:36 下午 - */ -public class WriteServer { - - public static void main(String[] args) throws IOException { - ServerSocketChannel ssc = ServerSocketChannel.open(); - ssc.configureBlocking(false); - Selector selector = Selector.open(); - ssc.register(selector, SelectionKey.OP_ACCEPT); - ssc.bind(new InetSocketAddress(8080)); - while (true) { - selector.select(); - Iterator iter = selector.selectedKeys().iterator(); - while (iter.hasNext()) { - SelectionKey key = iter.next(); - iter.remove(); - if (key.isAcceptable()) { - SocketChannel sc = ssc.accept(); - sc.configureBlocking(false); - SelectionKey sckey = sc.register(selector, 0, null); - sckey.interestOps(SelectionKey.OP_READ); - // 1. 向客户端发送大量数据 - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 5000000; i++) { - sb.append("a"); - } - ByteBuffer buffer = Charset.defaultCharset().encode(sb.toString()); - - // 2. 返回值代表实际写入的字节数 - int write = sc.write(buffer); - System.out.println(write); - - // 3. 判断是否有剩余内容 - if (buffer.hasRemaining()) { - // 4. 关注可写事件 1 4 - sckey.interestOps(sckey.interestOps() + SelectionKey.OP_WRITE); -// sckey.interestOps(sckey.interestOps() | SelectionKey.OP_WRITE); - // 5. 把未写完的数据挂到 sckey 上 - sckey.attach(buffer); - } - } else if (key.isWritable()) { - ByteBuffer buffer = (ByteBuffer) key.attachment(); - SocketChannel sc = (SocketChannel) key.channel(); - int write = sc.write(buffer); - System.out.println(write); - // 6. 清理操作 - if (!buffer.hasRemaining()) { - key.attach(null); // 需要清除buffer - key.interestOps(key.interestOps() - SelectionKey.OP_WRITE);//不需关注可写事件 - } - } - } - } - } - -} diff --git a/src/main/java/com/fangpeng/io/nio/file/FileCopyDemo.java b/src/main/java/com/fangpeng/io/nio/file/FileCopyDemo.java deleted file mode 100644 index 7a0d4792..00000000 --- a/src/main/java/com/fangpeng/io/nio/file/FileCopyDemo.java +++ /dev/null @@ -1,205 +0,0 @@ -package com.fangpeng.io.nio.file; - -import java.io.*; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; - -/** - * 文件拷贝 - * @author 方鹏 - * @date 2022年01月18日 10:52 下午 - */ -interface FileCopyRunner { - - void copyFile(File source, File target); - -} - -public class FileCopyDemo { - - private static final int ROUNDS = 5; - - private static void benchmark(FileCopyRunner test, File source, File target) { - long elapsed = 0L; - for (int i = 0; i < ROUNDS; i++) { - long startTime = System.currentTimeMillis(); - test.copyFile(source, target); - elapsed += System.currentTimeMillis() - startTime; - target.delete(); - } - System.out.println(test + ": " + elapsed / ROUNDS); - } - - private static void close(Closeable closeable) { - if (closeable != null) { - try { - closeable.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public static void main(String[] args) { - - FileCopyRunner noBufferStreamCopy = new FileCopyRunner() { - @Override - public void copyFile(File source, File target) { - InputStream fin = null; - OutputStream fout = null; - - try { - fin = new FileInputStream(source); - fout = new FileOutputStream(target); - - int result; - while ((result = fin.read()) != -1) { - fout.write(result); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(fin); - close(fout); - } - } - - @Override - public String toString() { - return "noBufferStreamCopy"; - } - }; - - FileCopyRunner bufferedStreamCopy = new FileCopyRunner() { - @Override - public void copyFile(File source, File target) { - InputStream fin = null; - OutputStream fout = null; - - - try { - fin = new BufferedInputStream(new FileInputStream(source)); - fout = new BufferedOutputStream(new FileOutputStream(target)); - - byte[] buffer = new byte[1024]; - - int result; - - while ((result = fin.read(buffer)) != -1) { - fout.write(buffer, 0, result); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(fin); - close(fout); - } - } - - @Override - public String toString() { - return "bufferedStreamCopy"; - } - }; - - FileCopyRunner nioBufferCopy = new FileCopyRunner() { - @Override - public void copyFile(File source, File target) { - FileChannel fin = null; - FileChannel fout = null; - - try { - fin = new FileInputStream(source).getChannel(); - fout = new FileOutputStream(target).getChannel(); - - ByteBuffer buffer = ByteBuffer.allocate(1024); - while (fin.read(buffer) != -1) { - buffer.flip(); - while (buffer.hasRemaining()) { - fout.write(buffer); - } - buffer.clear(); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(fin); - close(fout); - } - } - - @Override - public String toString() { - return "nioBufferCopy"; - } - }; - - FileCopyRunner nioTransferCopy = new FileCopyRunner() { - @Override - public void copyFile(File source, File target) { - FileChannel fin = null; - FileChannel fout = null; - - try { - fin = new FileInputStream(source).getChannel(); - fout = new FileOutputStream(target).getChannel(); - - long transferred = 0L; - long size = fin.size(); - while (transferred != size) { - transferred += fin.transferTo(0, size, fout); - } - - - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - close(fin); - close(fout); - } - } - - @Override - public String toString() { - return "nioTransferCopy"; - } - }; - - File smallFile = new File("/Users/fangpeng/test/smallFile"); - File smallFileCopy = new File("/Users/fangpeng/test/smallFile-copy"); - - System.out.println("---Copying small file---"); - benchmark(noBufferStreamCopy, smallFile, smallFileCopy); - benchmark(bufferedStreamCopy, smallFile, smallFileCopy); - benchmark(nioBufferCopy, smallFile, smallFileCopy); - benchmark(nioTransferCopy, smallFile, smallFileCopy); - - File bigFile = new File("/Users/fangpeng/test/bigFile"); - File bigFileCopy = new File("/Users/fangpeng/test/bigFile-copy"); - - System.out.println("---Copying big file---"); - benchmark(noBufferStreamCopy, bigFile, bigFileCopy); - benchmark(bufferedStreamCopy, bigFile, bigFileCopy); - benchmark(nioBufferCopy, bigFile, bigFileCopy); - benchmark(nioTransferCopy, bigFile, bigFileCopy); - - File hugeFile = new File("/Users/fangpeng/test/hugeFile"); - File hugeFileCopy = new File("/Users/fangpeng/test/hugeFile-copy"); - - System.out.println("---Copying huge file---"); - benchmark(noBufferStreamCopy, hugeFile, hugeFileCopy); - benchmark(bufferedStreamCopy, hugeFile, hugeFileCopy); - benchmark(nioBufferCopy, hugeFile, hugeFileCopy); - benchmark(nioTransferCopy, hugeFile, hugeFileCopy); - - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/Client1.java b/src/main/java/com/fangpeng/netty/advance/Client1.java deleted file mode 100644 index 8c46a6a8..00000000 --- a/src/main/java/com/fangpeng/netty/advance/Client1.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author 方鹏 - * @date 2022年01月26日 3:55 下午 - */ -public class Client1 { - - static final Logger log = LoggerFactory.getLogger(Client1.class); - - public static void main(String[] args) { - for (int i = 0; i < 10; i++) { - send(); - } - System.out.println("finish"); - } - - private static void send() { - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.channel(NioSocketChannel.class); - bootstrap.group(worker); - bootstrap.handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) { - ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { - // 会在连接 channel 建立成功后,会触发 active 事件 - @Override - public void channelActive(ChannelHandlerContext ctx) { - ByteBuf buf = ctx.alloc().buffer(16); - buf.writeBytes(new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17}); - ctx.writeAndFlush(buf); - ctx.channel().close(); - } - }); - } - }); - ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("Client error", e); - } finally { - worker.shutdownGracefully(); - } - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/Client2.java b/src/main/java/com/fangpeng/netty/advance/Client2.java deleted file mode 100644 index 084591f9..00000000 --- a/src/main/java/com/fangpeng/netty/advance/Client2.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; -import java.util.Random; - -/** - * @author 方鹏 - * @date 2022年01月26日 3:57 下午 - */ -public class Client2 { - static final Logger log = LoggerFactory.getLogger(Client1.class); - - public static void main(String[] args) { - send(); - System.out.println("finish"); - } - - public static byte[] fill10Bytes(char c, int len) { - byte[] bytes = new byte[10]; - Arrays.fill(bytes, (byte) '_'); - for (int i = 0; i < len; i++) { - bytes[i] = (byte) c; - } - System.out.println(new String(bytes)); - return bytes; - } - - private static void send() { - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.channel(NioSocketChannel.class); - bootstrap.group(worker); - bootstrap.handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) { - ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { - // 会在连接 channel 建立成功后,会触发 active 事件 - @Override - public void channelActive(ChannelHandlerContext ctx) { - ByteBuf buf = ctx.alloc().buffer(); - char c = '0'; - Random r = new Random(); - for (int i = 0; i < 10; i++) { - byte[] bytes = fill10Bytes(c, r.nextInt(10) + 1); - c++; - buf.writeBytes(bytes); - } - ctx.writeAndFlush(buf); - } - }); - } - }); - ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("Client error", e); - } finally { - worker.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/fangpeng/netty/advance/Client3.java b/src/main/java/com/fangpeng/netty/advance/Client3.java deleted file mode 100644 index 2fa8befd..00000000 --- a/src/main/java/com/fangpeng/netty/advance/Client3.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Random; - -/** - * @author 方鹏 - * @date 2022年01月26日 3:58 下午 - */ -public class Client3 { - - static final Logger log = LoggerFactory.getLogger(Client1.class); - - public static void main(String[] args) { - send(); - System.out.println("finish"); - } - - public static StringBuilder makeString(char c, int len) { - StringBuilder sb = new StringBuilder(len + 2); - for (int i = 0; i < len; i++) { - sb.append(c); - } - sb.append("\n"); - return sb; - } - - private static void send() { - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.channel(NioSocketChannel.class); - bootstrap.group(worker); - bootstrap.handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) { - ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { - // 会在连接 channel 建立成功后,会触发 active 事件 - @Override - public void channelActive(ChannelHandlerContext ctx) { - ByteBuf buf = ctx.alloc().buffer(); - char c = '0'; - Random r = new Random(); - for (int i = 0; i < 10; i++) { - StringBuilder sb = makeString(c, r.nextInt(256) + 1); - c++; - buf.writeBytes(sb.toString().getBytes()); - } - ctx.writeAndFlush(buf); - } - }); - } - }); - ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("Client error", e); - } finally { - worker.shutdownGracefully(); - } - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/HttpTest.java b/src/main/java/com/fangpeng/netty/advance/HttpTest.java deleted file mode 100644 index 92676cd9..00000000 --- a/src/main/java/com/fangpeng/netty/advance/HttpTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.http.DefaultFullHttpResponse; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponseStatus; -import io.netty.handler.codec.http.HttpServerCodec; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; - -import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_LENGTH; - -/** - * @author 方鹏 - * @date 2022年01月26日 4:25 下午 - */ -@Slf4j -public class HttpTest { - - public static void main(String[] args) { - NioEventLoopGroup boss = new NioEventLoopGroup(); - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.channel(NioServerSocketChannel.class); - serverBootstrap.group(boss, worker); - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - ch.pipeline().addLast(new HttpServerCodec()); - ch.pipeline().addLast(new SimpleChannelInboundHandler() { - @Override - protected void channelRead0(ChannelHandlerContext ctx, HttpRequest msg) throws Exception { - // 获取请求 - log.debug(msg.uri()); - - // 返回响应 - DefaultFullHttpResponse response = - new DefaultFullHttpResponse(msg.protocolVersion(), HttpResponseStatus.OK); - - byte[] bytes = "

Hello, world!

".getBytes(); - - response.headers().setInt(CONTENT_LENGTH, bytes.length); - response.content().writeBytes(bytes); - - // 写回响应 - ctx.writeAndFlush(response); - } - }); - /*ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - log.debug("{}", msg.getClass()); - - if (msg instanceof HttpRequest) { // 请求行,请求头 - - } else if (msg instanceof HttpContent) { //请求体 - - } - } - });*/ - } - }); - ChannelFuture channelFuture = serverBootstrap.bind(8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("server error", e); - } finally { - boss.shutdownGracefully(); - worker.shutdownGracefully(); - } - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/LengthFieldDecoderTest.java b/src/main/java/com/fangpeng/netty/advance/LengthFieldDecoderTest.java deleted file mode 100644 index cf03a615..00000000 --- a/src/main/java/com/fangpeng/netty/advance/LengthFieldDecoderTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.channel.embedded.EmbeddedChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; - -/** - * @author 方鹏 - * @date 2022年01月26日 4:09 下午 - */ -public class LengthFieldDecoderTest { - - public static void main(String[] args) { - EmbeddedChannel channel = new EmbeddedChannel( - new LengthFieldBasedFrameDecoder( - 1024, 0, 4, 1,4), - new LoggingHandler(LogLevel.DEBUG) - ); - - // 4 个字节的内容长度, 实际内容 - ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(); - send(buffer, "Hello, world"); - send(buffer, "Hi!"); - channel.writeInbound(buffer); - } - - private static void send(ByteBuf buffer, String content) { - byte[] bytes = content.getBytes(); // 实际内容 - int length = bytes.length; // 实际内容长度 - buffer.writeInt(length); - buffer.writeByte(1); - buffer.writeBytes(bytes); - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/RedisTest.java b/src/main/java/com/fangpeng/netty/advance/RedisTest.java deleted file mode 100644 index a4474d29..00000000 --- a/src/main/java/com/fangpeng/netty/advance/RedisTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; - -/** - * @author 方鹏 - * @date 2022年01月26日 4:20 下午 - */ -@Slf4j -public class RedisTest { - - /* - set name zhangsan - *3 - $3 - set - $4 - name - $8 - zhangsan - */ - public static void main(String[] args) { - final byte[] LINE = {13, 10}; - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.channel(NioSocketChannel.class); - bootstrap.group(worker); - bootstrap.handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) { - ch.pipeline().addLast(new LoggingHandler()); - ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { - @Override - public void channelActive(ChannelHandlerContext ctx) { - ByteBuf buf = ctx.alloc().buffer(); - buf.writeBytes("*3".getBytes()); - buf.writeBytes(LINE); - buf.writeBytes("$3".getBytes()); - buf.writeBytes(LINE); - buf.writeBytes("set".getBytes()); - buf.writeBytes(LINE); - buf.writeBytes("$4".getBytes()); - buf.writeBytes(LINE); - buf.writeBytes("name".getBytes()); - buf.writeBytes(LINE); - buf.writeBytes("$8".getBytes()); - buf.writeBytes(LINE); - buf.writeBytes("zhangsan".getBytes()); - buf.writeBytes(LINE); - ctx.writeAndFlush(buf); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - ByteBuf buf = (ByteBuf) msg; - System.out.println(buf.toString(Charset.defaultCharset())); - } - }); - } - }); - ChannelFuture channelFuture = bootstrap.connect("localhost", 6379).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("Client error", e); - } finally { - worker.shutdownGracefully(); - } - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/Server1.java b/src/main/java/com/fangpeng/netty/advance/Server1.java deleted file mode 100644 index 02d8e95b..00000000 --- a/src/main/java/com/fangpeng/netty/advance/Server1.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.AdaptiveRecvByteBufAllocator; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; - -/** - * @author 方鹏 - * @date 2022年01月26日 3:56 下午 - */ -@Slf4j -public class Server1 { - void start() { - NioEventLoopGroup boss = new NioEventLoopGroup(); - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.channel(NioServerSocketChannel.class); - // 调整系统的接收缓冲器(滑动窗口) -// serverBootstrap.option(ChannelOption.SO_RCVBUF, 10); - // 调整 netty 的接收缓冲区(byteBuf) - serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(16, 16, 16)); - serverBootstrap.group(boss, worker); - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - } - }); - ChannelFuture channelFuture = serverBootstrap.bind(8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("server error", e); - } finally { - boss.shutdownGracefully(); - worker.shutdownGracefully(); - } - } - - public static void main(String[] args) { - new Server1().start(); - } -} \ No newline at end of file diff --git a/src/main/java/com/fangpeng/netty/advance/Server2.java b/src/main/java/com/fangpeng/netty/advance/Server2.java deleted file mode 100644 index c7298af7..00000000 --- a/src/main/java/com/fangpeng/netty/advance/Server2.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.AdaptiveRecvByteBufAllocator; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.FixedLengthFrameDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; - -/** - * @author 方鹏 - * @date 2022年01月26日 3:58 下午 - */ -@Slf4j -public class Server2 { - - void start() { - NioEventLoopGroup boss = new NioEventLoopGroup(); - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.channel(NioServerSocketChannel.class); - // 调整系统的接收缓冲区(滑动窗口) -// serverBootstrap.option(ChannelOption.SO_RCVBUF, 10); - // 调整 netty 的接收缓冲区(byteBuf) - serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(16, 16, 16)); - serverBootstrap.group(boss, worker); - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new FixedLengthFrameDecoder(10)); - ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - } - }); - ChannelFuture channelFuture = serverBootstrap.bind(8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("server error", e); - } finally { - boss.shutdownGracefully(); - worker.shutdownGracefully(); - } - } - - public static void main(String[] args) { - new Server2().start(); - } - -} diff --git a/src/main/java/com/fangpeng/netty/advance/Server3.java b/src/main/java/com/fangpeng/netty/advance/Server3.java deleted file mode 100644 index 8a35f0dd..00000000 --- a/src/main/java/com/fangpeng/netty/advance/Server3.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.fangpeng.netty.advance; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.AdaptiveRecvByteBufAllocator; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.LineBasedFrameDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import lombok.extern.slf4j.Slf4j; - -/** - * @author 方鹏 - * @date 2022年01月26日 3:59 下午 - */ -@Slf4j -public class Server3 { - - void start() { - NioEventLoopGroup boss = new NioEventLoopGroup(); - NioEventLoopGroup worker = new NioEventLoopGroup(); - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.channel(NioServerSocketChannel.class); - // 调整系统的接收缓冲区(滑动窗口) -// serverBootstrap.option(ChannelOption.SO_RCVBUF, 10); - // 调整 netty 的接收缓冲区(byteBuf) - serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(16, 16, 16)); - serverBootstrap.group(boss, worker); - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new LineBasedFrameDecoder(1024)); - ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - } - }); - ChannelFuture channelFuture = serverBootstrap.bind(8080).sync(); - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - log.error("server error", e); - } finally { - boss.shutdownGracefully(); - worker.shutdownGracefully(); - } - } - - public static void main(String[] args) { - new Server3().start(); - } - -} diff --git a/src/main/java/com/fangpeng/netty/chat/client/ChatClient.java b/src/main/java/com/fangpeng/netty/chat/client/ChatClient.java deleted file mode 100644 index b8a73667..00000000 --- a/src/main/java/com/fangpeng/netty/chat/client/ChatClient.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.fangpeng.netty.chat.client; - -import com.fangpeng.netty.chat.message.*; -import com.fangpeng.netty.chat.protocol.MessageCodecSharable; -import com.fangpeng.netty.chat.protocol.ProcotolFrameDecoder; -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import io.netty.handler.timeout.IdleState; -import io.netty.handler.timeout.IdleStateEvent; -import io.netty.handler.timeout.IdleStateHandler; -import lombok.extern.slf4j.Slf4j; - -import java.io.IOException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Scanner; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * @author 方鹏 - * @date 2022年01月26日 6:14 下午 - */ -@Slf4j -public class ChatClient { - - public static void main(String[] args) { - NioEventLoopGroup group = new NioEventLoopGroup(); - LoggingHandler LOGGING_HANDLER = new LoggingHandler(LogLevel.DEBUG); - MessageCodecSharable MESSAGE_CODEC = new MessageCodecSharable(); - CountDownLatch WAIT_FOR_LOGIN = new CountDownLatch(1); - AtomicBoolean LOGIN = new AtomicBoolean(false); - AtomicBoolean EXIT = new AtomicBoolean(false); - Scanner scanner = new Scanner(System.in); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.channel(NioSocketChannel.class); - bootstrap.group(group); - bootstrap.handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new ProcotolFrameDecoder()); - ch.pipeline().addLast(MESSAGE_CODEC); - // 用来判断是不是 读空闲时间过长,或 写空闲时间过长 - // 3s 内如果没有向服务器写数据,会触发一个 IdleState#WRITER_IDLE 事件 - ch.pipeline().addLast(new IdleStateHandler(0, 3, 0)); - // ChannelDuplexHandler 可以同时作为入站和出站处理器 - ch.pipeline().addLast(new ChannelDuplexHandler() { - // 用来触发特殊事件 - @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception{ - IdleStateEvent event = (IdleStateEvent) evt; - // 触发了写空闲事件 - if (event.state() == IdleState.WRITER_IDLE) { -// log.debug("3s 没有写数据了,发送一个心跳包"); - ctx.writeAndFlush(new PingMessage()); - } - } - }); - ch.pipeline().addLast("Client handler", new ChannelInboundHandlerAdapter() { - // 接收响应消息 - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - log.debug("msg: {}", msg); - if ((msg instanceof LoginResponseMessage)) { - LoginResponseMessage response = (LoginResponseMessage) msg; - if (response.isSuccess()) { - // 如果登录成功 - LOGIN.set(true); - } - // 唤醒 system in 线程 - WAIT_FOR_LOGIN.countDown(); - } - } - - // 在连接建立后触发 active 事件 - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - // 负责接收用户在控制台的输入,负责向服务器发送各种消息 - new Thread(() -> { - System.out.println("请输入用户名:"); - String username = scanner.nextLine(); - if(EXIT.get()){ - return; - } - System.out.println("请输入密码:"); - String password = scanner.nextLine(); - if(EXIT.get()){ - return; - } - // 构造消息对象 - LoginRequestMessage message = new LoginRequestMessage(username, password, username); - System.out.println(message); - // 发送消息 - ctx.writeAndFlush(message); - System.out.println("等待后续操作..."); - try { - WAIT_FOR_LOGIN.await(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - // 如果登录失败 - if (!LOGIN.get()) { - ctx.channel().close(); - return; - } - while (true) { - System.out.println("=================================="); - System.out.println("send [username] [content]"); - System.out.println("gsend [group name] [content]"); - System.out.println("gcreate [group name] [m1,m2,m3...]"); - System.out.println("gmembers [group name]"); - System.out.println("gjoin [group name]"); - System.out.println("gquit [group name]"); - System.out.println("quit"); - System.out.println("=================================="); - String command = null; - try { - command = scanner.nextLine(); - } catch (Exception e) { - break; - } - if(EXIT.get()){ - return; - } - String[] s = command.split(" "); - switch (s[0]){ - case "send": - ctx.writeAndFlush(new ChatRequestMessage(username, s[1], s[2])); - break; - case "gsend": - ctx.writeAndFlush(new GroupChatRequestMessage(username, s[1], s[2])); - break; - case "gcreate": - Set set = new HashSet<>(Arrays.asList(s[2].split(","))); - set.add(username); // 加入自己 - ctx.writeAndFlush(new GroupCreateRequestMessage(s[1], set)); - break; - case "gmembers": - ctx.writeAndFlush(new GroupMembersRequestMessage(s[1])); - break; - case "gjoin": - ctx.writeAndFlush(new GroupJoinRequestMessage(username, s[1])); - break; - case "gquit": - ctx.writeAndFlush(new GroupQuitRequestMessage(username, s[1])); - break; - case "quit": - ctx.channel().close(); - return; - } - } - }, "system in").start(); - } - - // 在连接断开时触发 - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - log.debug("连接已经断开,按任意键退出.."); - EXIT.set(true); - } - - // 在出现异常时触发 - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - log.debug("连接已经断开,按任意键退出..{}", cause.getMessage()); - EXIT.set(true); - } - }); - } - }); - Channel channel = bootstrap.connect("localhost", 8080).sync().channel(); - channel.closeFuture().sync(); - } catch (Exception e) { - log.error("Client error", e); - } finally { - group.shutdownGracefully(); - } - } - -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/AbstractResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/AbstractResponseMessage.java deleted file mode 100644 index 8d9fcc7a..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/AbstractResponseMessage.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public abstract class AbstractResponseMessage extends Message { - private boolean success; - private String reason; - - public AbstractResponseMessage() { - } - - public AbstractResponseMessage(boolean success, String reason) { - this.success = success; - this.reason = reason; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/ChatRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/ChatRequestMessage.java deleted file mode 100644 index 3bf305e9..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/ChatRequestMessage.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class ChatRequestMessage extends Message { - private String content; - private String to; - private String from; - - public ChatRequestMessage() { - } - - public ChatRequestMessage(String from, String to, String content) { - this.from = from; - this.to = to; - this.content = content; - } - - @Override - public int getMessageType() { - return ChatRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/ChatResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/ChatResponseMessage.java deleted file mode 100644 index f1bae30d..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/ChatResponseMessage.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class ChatResponseMessage extends AbstractResponseMessage { - - private String from; - private String content; - - public ChatResponseMessage(boolean success, String reason) { - super(success, reason); - } - - public ChatResponseMessage(String from, String content) { - this.from = from; - this.content = content; - } - - @Override - public int getMessageType() { - return ChatResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupChatRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupChatRequestMessage.java deleted file mode 100644 index b626c4ef..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupChatRequestMessage.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupChatRequestMessage extends Message { - private String content; - private String groupName; - private String from; - - public GroupChatRequestMessage(String from, String groupName, String content) { - this.content = content; - this.groupName = groupName; - this.from = from; - } - - @Override - public int getMessageType() { - return GroupChatRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupChatResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupChatResponseMessage.java deleted file mode 100644 index d70f206e..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupChatResponseMessage.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupChatResponseMessage extends AbstractResponseMessage { - private String from; - private String content; - - public GroupChatResponseMessage(boolean success, String reason) { - super(success, reason); - } - - public GroupChatResponseMessage(String from, String content) { - this.from = from; - this.content = content; - } - @Override - public int getMessageType() { - return GroupChatResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupCreateRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupCreateRequestMessage.java deleted file mode 100644 index 88fd623b..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupCreateRequestMessage.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -import java.util.Set; - -@Data -@ToString(callSuper = true) -public class GroupCreateRequestMessage extends Message { - private String groupName; - private Set members; - - public GroupCreateRequestMessage(String groupName, Set members) { - this.groupName = groupName; - this.members = members; - } - - @Override - public int getMessageType() { - return GroupCreateRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupCreateResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupCreateResponseMessage.java deleted file mode 100644 index 5c10e822..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupCreateResponseMessage.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupCreateResponseMessage extends AbstractResponseMessage { - - public GroupCreateResponseMessage(boolean success, String reason) { - super(success, reason); - } - - @Override - public int getMessageType() { - return GroupCreateResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupJoinRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupJoinRequestMessage.java deleted file mode 100644 index d5e97219..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupJoinRequestMessage.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupJoinRequestMessage extends Message { - private String groupName; - - private String username; - - public GroupJoinRequestMessage(String username, String groupName) { - this.groupName = groupName; - this.username = username; - } - - @Override - public int getMessageType() { - return GroupJoinRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupJoinResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupJoinResponseMessage.java deleted file mode 100644 index 2825f148..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupJoinResponseMessage.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupJoinResponseMessage extends AbstractResponseMessage { - - public GroupJoinResponseMessage(boolean success, String reason) { - super(success, reason); - } - - @Override - public int getMessageType() { - return GroupJoinResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupMembersRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupMembersRequestMessage.java deleted file mode 100644 index 39b269ce..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupMembersRequestMessage.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupMembersRequestMessage extends Message { - private String groupName; - - public GroupMembersRequestMessage(String groupName) { - this.groupName = groupName; - } - - @Override - public int getMessageType() { - return GroupMembersRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupMembersResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupMembersResponseMessage.java deleted file mode 100644 index 74d99c75..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupMembersResponseMessage.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -import java.util.Set; - -@Data -@ToString(callSuper = true) -public class GroupMembersResponseMessage extends Message { - - private Set members; - - public GroupMembersResponseMessage(Set members) { - this.members = members; - } - - @Override - public int getMessageType() { - return GroupMembersResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupQuitRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupQuitRequestMessage.java deleted file mode 100644 index cec0a6df..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupQuitRequestMessage.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupQuitRequestMessage extends Message { - private String groupName; - - private String username; - - public GroupQuitRequestMessage(String username, String groupName) { - this.groupName = groupName; - this.username = username; - } - - @Override - public int getMessageType() { - return GroupQuitRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/GroupQuitResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/GroupQuitResponseMessage.java deleted file mode 100644 index 984d7df4..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/GroupQuitResponseMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class GroupQuitResponseMessage extends AbstractResponseMessage { - public GroupQuitResponseMessage(boolean success, String reason) { - super(success, reason); - } - - @Override - public int getMessageType() { - return GroupQuitResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/LoginRequestMessage.java b/src/main/java/com/fangpeng/netty/chat/message/LoginRequestMessage.java deleted file mode 100644 index 8d33b2f4..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/LoginRequestMessage.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class LoginRequestMessage extends Message { - private String username; - private String password; - private String nickname; - - public LoginRequestMessage() { - } - - public LoginRequestMessage(String username, String password, String nickname) { - this.username = username; - this.password = password; - this.nickname = nickname; - } - - @Override - public int getMessageType() { - return LoginRequestMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/LoginResponseMessage.java b/src/main/java/com/fangpeng/netty/chat/message/LoginResponseMessage.java deleted file mode 100644 index ad2242cd..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/LoginResponseMessage.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; -import lombok.ToString; - -@Data -@ToString(callSuper = true) -public class LoginResponseMessage extends AbstractResponseMessage { - public LoginResponseMessage(boolean success, String reason) { - super(success, reason); - } - - @Override - public int getMessageType() { - return LoginResponseMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/Message.java b/src/main/java/com/fangpeng/netty/chat/message/Message.java deleted file mode 100644 index 1200f515..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/Message.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.fangpeng.netty.chat.message; - -import lombok.Data; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -@Data -public abstract class Message implements Serializable { - - public static Class getMessageClass(int messageType) { - return messageClasses.get(messageType); - } - - private int sequenceId; - - private int messageType; - - public abstract int getMessageType(); - - public static final int LoginRequestMessage = 0; - public static final int LoginResponseMessage = 1; - public static final int ChatRequestMessage = 2; - public static final int ChatResponseMessage = 3; - public static final int GroupCreateRequestMessage = 4; - public static final int GroupCreateResponseMessage = 5; - public static final int GroupJoinRequestMessage = 6; - public static final int GroupJoinResponseMessage = 7; - public static final int GroupQuitRequestMessage = 8; - public static final int GroupQuitResponseMessage = 9; - public static final int GroupChatRequestMessage = 10; - public static final int GroupChatResponseMessage = 11; - public static final int GroupMembersRequestMessage = 12; - public static final int GroupMembersResponseMessage = 13; - public static final int PingMessage = 14; - public static final int PongMessage = 15; - private static final Map> messageClasses = new HashMap<>(); - - static { - messageClasses.put(LoginRequestMessage, LoginRequestMessage.class); - messageClasses.put(LoginResponseMessage, LoginResponseMessage.class); - messageClasses.put(ChatRequestMessage, ChatRequestMessage.class); - messageClasses.put(ChatResponseMessage, ChatResponseMessage.class); - messageClasses.put(GroupCreateRequestMessage, GroupCreateRequestMessage.class); - messageClasses.put(GroupCreateResponseMessage, GroupCreateResponseMessage.class); - messageClasses.put(GroupJoinRequestMessage, GroupJoinRequestMessage.class); - messageClasses.put(GroupJoinResponseMessage, GroupJoinResponseMessage.class); - messageClasses.put(GroupQuitRequestMessage, GroupQuitRequestMessage.class); - messageClasses.put(GroupQuitResponseMessage, GroupQuitResponseMessage.class); - messageClasses.put(GroupChatRequestMessage, GroupChatRequestMessage.class); - messageClasses.put(GroupChatResponseMessage, GroupChatResponseMessage.class); - messageClasses.put(GroupMembersRequestMessage, GroupMembersRequestMessage.class); - messageClasses.put(GroupMembersResponseMessage, GroupMembersResponseMessage.class); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/message/PingMessage.java b/src/main/java/com/fangpeng/netty/chat/message/PingMessage.java deleted file mode 100644 index 431406dd..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/PingMessage.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fangpeng.netty.chat.message; - -/** - * @author 方鹏 - * @date 2022年01月26日 9:25 下午 - */ -public class PingMessage extends Message { - @Override - public int getMessageType() { - return PingMessage; - } -} - diff --git a/src/main/java/com/fangpeng/netty/chat/message/PongMessage.java b/src/main/java/com/fangpeng/netty/chat/message/PongMessage.java deleted file mode 100644 index 62666727..00000000 --- a/src/main/java/com/fangpeng/netty/chat/message/PongMessage.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.fangpeng.netty.chat.message; - -/** - * @author 方鹏 - * @date 2022年01月26日 9:26 下午 - */ -public class PongMessage extends Message { - @Override - public int getMessageType() { - return PongMessage; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/protocol/MessageCodec.java b/src/main/java/com/fangpeng/netty/chat/protocol/MessageCodec.java deleted file mode 100644 index 5c534385..00000000 --- a/src/main/java/com/fangpeng/netty/chat/protocol/MessageCodec.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.fangpeng.netty.chat.protocol; - -import com.fangpeng.netty.chat.message.Message; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageCodec; -import lombok.extern.slf4j.Slf4j; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.List; - -/** - * @author 方鹏 - * @date 2022年01月26日 5:18 下午 - */ -@Slf4j -public class MessageCodec extends ByteToMessageCodec { - - - @Override - public void encode(ChannelHandlerContext ctx, Message message, ByteBuf byteBuf) throws Exception { - // 1. 4 字节的魔数 - byteBuf.writeBytes(new byte[]{1, 2, 3, 4}); - // 2. 1 字节的版本, - byteBuf.writeByte(1); - // 3. 1 字节的序列化方式 jdk 0 , json 1 - byteBuf.writeByte(0); - // 4. 1 字节的指令类型(什么类型的消息) - byteBuf.writeByte(message.getMessageType()); - // 5. 请求序号,4 个字节 - byteBuf.writeInt(message.getSequenceId()); - // 无意义,对齐填充 - byteBuf.writeByte(0xff); - // 6. 获取内容的字节数组 - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(message); - - byte[] bytes = bos.toByteArray(); - // 7. 长度 - byteBuf.writeInt(bytes.length); - // 8. 写入内容 - byteBuf.writeBytes(bytes); - } - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List list) throws Exception { - int magicNum = byteBuf.readInt(); - byte version = byteBuf.readByte(); - byte serializerType = byteBuf.readByte(); - byte messageType = byteBuf.readByte(); - int sequenceId = byteBuf.readInt(); - byteBuf.readByte(); - int length = byteBuf.readInt(); - byte[] bytes = new byte[length]; - byteBuf.readBytes(bytes, 0, length); - ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes)); - Message message = (Message) ois.readObject(); - log.debug("{}, {}, {}, {}, {}, {}", magicNum, version, serializerType, messageType, sequenceId, length); - log.debug("{}", message); - list.add(message); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/protocol/MessageCodecSharable.java b/src/main/java/com/fangpeng/netty/chat/protocol/MessageCodecSharable.java deleted file mode 100644 index 3c73732c..00000000 --- a/src/main/java/com/fangpeng/netty/chat/protocol/MessageCodecSharable.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.fangpeng.netty.chat.protocol; - -import com.fangpeng.netty.chat.message.Message; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToMessageCodec; -import lombok.extern.slf4j.Slf4j; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.List; - -/** - * @author 方鹏 - * @date 2022年01月26日 6:07 下午 - */ -@Slf4j -@ChannelHandler.Sharable -/** - * 必须和 LengthFieldBasedFrameDecoder 一起使用,确保接到的 ByteBuf 消息是完整的 - */ -public class MessageCodecSharable extends MessageToMessageCodec { - @Override - protected void encode(ChannelHandlerContext ctx, Message msg, List outList) throws Exception { - ByteBuf out = ctx.alloc().buffer(); - // 1. 4 字节的魔数 - out.writeBytes(new byte[]{1, 2, 3, 4}); - // 2. 1 字节的版本, - out.writeByte(1); - // 3. 1 字节的序列化方式 jdk 0 , json 1 - out.writeByte(0); - // 4. 1 字节的指令类型 - out.writeByte(msg.getMessageType()); - // 5. 4 个字节 - out.writeInt(msg.getSequenceId()); - // 无意义,对齐填充 - out.writeByte(0xff); - // 6. 获取内容的字节数组 - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(msg); - byte[] bytes = bos.toByteArray(); - // 7. 长度 - out.writeInt(bytes.length); - // 8. 写入内容 - out.writeBytes(bytes); - outList.add(out); - } - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { - int magicNum = in.readInt(); - byte version = in.readByte(); - byte serializerType = in.readByte(); - byte messageType = in.readByte(); - int sequenceId = in.readInt(); - in.readByte(); - int length = in.readInt(); - byte[] bytes = new byte[length]; - in.readBytes(bytes, 0, length); - ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes)); - Message message = (Message) ois.readObject(); - log.debug("{}, {}, {}, {}, {}, {}", magicNum, version, serializerType, messageType, sequenceId, length); - log.debug("{}", message); - out.add(message); - } -} - diff --git a/src/main/java/com/fangpeng/netty/chat/protocol/ProcotolFrameDecoder.java b/src/main/java/com/fangpeng/netty/chat/protocol/ProcotolFrameDecoder.java deleted file mode 100644 index 346f39fd..00000000 --- a/src/main/java/com/fangpeng/netty/chat/protocol/ProcotolFrameDecoder.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.fangpeng.netty.chat.protocol; - -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; - -/** - * @author 方鹏 - * @date 2022年01月26日 6:19 下午 - */ -public class ProcotolFrameDecoder extends LengthFieldBasedFrameDecoder { - - public ProcotolFrameDecoder() { - this(1024, 12, 4, 0, 0); - } - - public ProcotolFrameDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip) { - super(maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment, initialBytesToStrip); - } - -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/ChatServer.java b/src/main/java/com/fangpeng/netty/chat/server/ChatServer.java deleted file mode 100644 index cac15b7c..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/ChatServer.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.fangpeng.netty.chat.server; - -import com.fangpeng.netty.chat.protocol.MessageCodecSharable; -import com.fangpeng.netty.chat.protocol.ProcotolFrameDecoder; -import com.fangpeng.netty.chat.server.handler.*; -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import io.netty.handler.timeout.IdleState; -import io.netty.handler.timeout.IdleStateEvent; -import io.netty.handler.timeout.IdleStateHandler; -import lombok.extern.slf4j.Slf4j; - -/** - * @author 方鹏 - * @date 2022年01月26日 5:54 下午 - */ -@Slf4j -public class ChatServer { - - public static void main(String[] args) { - NioEventLoopGroup boss = new NioEventLoopGroup(); - NioEventLoopGroup worker = new NioEventLoopGroup(); - LoggingHandler LOGGING_HANDLER = new LoggingHandler(LogLevel.DEBUG); - MessageCodecSharable MESSAGE_CODEC = new MessageCodecSharable(); - LoginRequestMessageHandler LOGIN_HANDLER = new LoginRequestMessageHandler(); - ChatRequestMessageHandler CHAT_HANDLER = new ChatRequestMessageHandler(); - GroupCreateRequestMessageHandler GROUP_CREATE_HANDLER = new GroupCreateRequestMessageHandler(); - GroupJoinRequestMessageHandler GROUP_JOIN_HANDLER = new GroupJoinRequestMessageHandler(); - GroupMembersRequestMessageHandler GROUP_MEMBERS_HANDLER = new GroupMembersRequestMessageHandler(); - GroupQuitRequestMessageHandler GROUP_QUIT_HANDLER = new GroupQuitRequestMessageHandler(); - GroupChatRequestMessageHandler GROUP_CHAT_HANDLER = new GroupChatRequestMessageHandler(); - QuitHandler QUIT_HANDLER = new QuitHandler(); - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.channel(NioServerSocketChannel.class); - serverBootstrap.group(boss, worker); - serverBootstrap.childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new ProcotolFrameDecoder()); - ch.pipeline().addLast(LOGGING_HANDLER); - ch.pipeline().addLast(MESSAGE_CODEC); - // 用来判断是不是 读空闲时间过长,或 写空闲时间过长 - // 5s 内如果没有收到 channel 的数据,会触发一个 IdleState#READER_IDLE 事件 - ch.pipeline().addLast(new IdleStateHandler(5, 0, 0)); - // ChannelDuplexHandler 可以同时作为入站和出站处理器 - ch.pipeline().addLast(new ChannelDuplexHandler() { - // 用来触发特殊事件 - @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception{ - IdleStateEvent event = (IdleStateEvent) evt; - // 触发了读空闲事件 - if (event.state() == IdleState.READER_IDLE) { - log.debug("已经 5s 没有读到数据了"); - ctx.channel().close(); - } - } - }); - ch.pipeline().addLast(LOGIN_HANDLER); - ch.pipeline().addLast(CHAT_HANDLER); - ch.pipeline().addLast(GROUP_CREATE_HANDLER); - ch.pipeline().addLast(GROUP_JOIN_HANDLER); - ch.pipeline().addLast(GROUP_MEMBERS_HANDLER); - ch.pipeline().addLast(GROUP_QUIT_HANDLER); - ch.pipeline().addLast(GROUP_CHAT_HANDLER); - ch.pipeline().addLast(QUIT_HANDLER); - } - }); - Channel channel = serverBootstrap.bind(8080).sync().channel(); - channel.closeFuture().sync(); - } catch (InterruptedException e) { - log.error("server error", e); - } finally { - boss.shutdownGracefully(); - worker.shutdownGracefully(); - } - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/ChatRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/ChatRequestMessageHandler.java deleted file mode 100644 index 299e7be8..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/ChatRequestMessageHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - - -import com.fangpeng.netty.chat.message.ChatRequestMessage; -import com.fangpeng.netty.chat.message.ChatResponseMessage; -import com.fangpeng.netty.chat.server.session.SessionFactory; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -@ChannelHandler.Sharable -public class ChatRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, ChatRequestMessage msg) throws Exception { - String to = msg.getTo(); - Channel channel = SessionFactory.getSession().getChannel(to); - // 在线 - if (channel != null) { - channel.writeAndFlush(new ChatResponseMessage(msg.getFrom(), msg.getContent())); - } - // 不在线 - else { - ctx.writeAndFlush(new ChatResponseMessage(false, "对方用户不存在或者不在线")); - } - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupChatRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/GroupChatRequestMessageHandler.java deleted file mode 100644 index 5aa648c9..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupChatRequestMessageHandler.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - -import com.fangpeng.netty.chat.message.GroupChatRequestMessage; -import com.fangpeng.netty.chat.message.GroupChatResponseMessage; -import com.fangpeng.netty.chat.server.session.GroupSessionFactory; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -import java.util.List; - -@ChannelHandler.Sharable -public class GroupChatRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, GroupChatRequestMessage msg) throws Exception { - List channels = GroupSessionFactory.getGroupSession() - .getMembersChannel(msg.getGroupName()); - - for (Channel channel : channels) { - channel.writeAndFlush(new GroupChatResponseMessage(msg.getFrom(), msg.getContent())); - } - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupCreateRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/GroupCreateRequestMessageHandler.java deleted file mode 100644 index 0fa6b5d3..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupCreateRequestMessageHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - -import com.fangpeng.netty.chat.message.GroupCreateRequestMessage; -import com.fangpeng.netty.chat.message.GroupCreateResponseMessage; -import com.fangpeng.netty.chat.server.session.Group; -import com.fangpeng.netty.chat.server.session.GroupSession; -import com.fangpeng.netty.chat.server.session.GroupSessionFactory; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -import java.util.List; -import java.util.Set; - -@ChannelHandler.Sharable -public class GroupCreateRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, GroupCreateRequestMessage msg) throws Exception { - String groupName = msg.getGroupName(); - Set members = msg.getMembers(); - // 群管理器 - GroupSession groupSession = GroupSessionFactory.getGroupSession(); - Group group = groupSession.createGroup(groupName, members); - if (group == null) { - // 发生成功消息 - ctx.writeAndFlush(new GroupCreateResponseMessage(true, groupName + "创建成功")); - // 发送拉群消息 - List channels = groupSession.getMembersChannel(groupName); - for (Channel channel : channels) { - channel.writeAndFlush(new GroupCreateResponseMessage(true, "您已被拉入" + groupName)); - } - } else { - ctx.writeAndFlush(new GroupCreateResponseMessage(false, groupName + "已经存在")); - } - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupJoinRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/GroupJoinRequestMessageHandler.java deleted file mode 100644 index f8e42957..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupJoinRequestMessageHandler.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - -import com.fangpeng.netty.chat.message.GroupJoinRequestMessage; -import com.fangpeng.netty.chat.message.GroupJoinResponseMessage; -import com.fangpeng.netty.chat.server.session.Group; -import com.fangpeng.netty.chat.server.session.GroupSessionFactory; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -@ChannelHandler.Sharable -public class GroupJoinRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, GroupJoinRequestMessage msg) throws Exception { - Group group = GroupSessionFactory.getGroupSession().joinMember(msg.getGroupName(), msg.getUsername()); - if (group != null) { - ctx.writeAndFlush(new GroupJoinResponseMessage(true, msg.getGroupName() + "群加入成功")); - } else { - ctx.writeAndFlush(new GroupJoinResponseMessage(true, msg.getGroupName() + "群不存在")); - } - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupMembersRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/GroupMembersRequestMessageHandler.java deleted file mode 100644 index 75a75c54..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupMembersRequestMessageHandler.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - - -import com.fangpeng.netty.chat.message.GroupMembersRequestMessage; -import com.fangpeng.netty.chat.message.GroupMembersResponseMessage; -import com.fangpeng.netty.chat.server.session.GroupSessionFactory; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -import java.util.Set; - -@ChannelHandler.Sharable -public class GroupMembersRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, GroupMembersRequestMessage msg) throws Exception { - Set members = GroupSessionFactory.getGroupSession() - .getMembers(msg.getGroupName()); - ctx.writeAndFlush(new GroupMembersResponseMessage(members)); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupQuitRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/GroupQuitRequestMessageHandler.java deleted file mode 100644 index ba9c11e4..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/GroupQuitRequestMessageHandler.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - -import com.fangpeng.netty.chat.message.GroupQuitRequestMessage; -import com.fangpeng.netty.chat.server.session.Group; -import com.fangpeng.netty.chat.server.session.GroupSessionFactory; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -import static com.fangpeng.netty.chat.message.Message.GroupJoinResponseMessage; - -@ChannelHandler.Sharable -public class GroupQuitRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, GroupQuitRequestMessage msg) throws Exception { - Group group = GroupSessionFactory.getGroupSession().removeMember(msg.getGroupName(), msg.getUsername()); - /*if (group != null) { - ctx.writeAndFlush(new GroupJoinResponseMessage(true, "已退出群" + msg.getGroupName())); - } else { - ctx.writeAndFlush(new GroupJoinResponseMessage(true, msg.getGroupName() + "群不存在")); - }*/ - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/LoginRequestMessageHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/LoginRequestMessageHandler.java deleted file mode 100644 index 08fb310e..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/LoginRequestMessageHandler.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - - -import com.fangpeng.netty.chat.message.LoginRequestMessage; -import com.fangpeng.netty.chat.message.LoginResponseMessage; -import com.fangpeng.netty.chat.server.service.UserServiceFactory; -import com.fangpeng.netty.chat.server.session.SessionFactory; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -@ChannelHandler.Sharable -public class LoginRequestMessageHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, LoginRequestMessage msg) throws Exception { - String username = msg.getUsername(); - String password = msg.getPassword(); - boolean login = UserServiceFactory.getUserService().login(username, password); - LoginResponseMessage message; - if (login) { - SessionFactory.getSession().bind(ctx.channel(), username); - message = new LoginResponseMessage(true, "登录成功"); - } else { - message = new LoginResponseMessage(false, "用户名或密码不正确"); - } - ctx.writeAndFlush(message); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/handler/QuitHandler.java b/src/main/java/com/fangpeng/netty/chat/server/handler/QuitHandler.java deleted file mode 100644 index cfb37e59..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/handler/QuitHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.netty.chat.server.handler; - - -import com.fangpeng.netty.chat.server.session.SessionFactory; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@ChannelHandler.Sharable -public class QuitHandler extends ChannelInboundHandlerAdapter { - - // 当连接断开时触发 inactive 事件 - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - SessionFactory.getSession().unbind(ctx.channel()); - log.debug("{} 已经断开", ctx.channel()); - } - - // 当出现异常时触发 - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - SessionFactory.getSession().unbind(ctx.channel()); - log.debug("{} 已经异常断开 异常是{}", ctx.channel(), cause.getMessage()); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/service/UserService.java b/src/main/java/com/fangpeng/netty/chat/server/service/UserService.java deleted file mode 100644 index 48f0eaaa..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/service/UserService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.netty.chat.server.service; - -/** - * 用户管理接口 - */ -public interface UserService { - - /** - * 登录 - * @param username 用户名 - * @param password 密码 - * @return 登录成功返回 true, 否则返回 false - */ - boolean login(String username, String password); -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/service/UserServiceFactory.java b/src/main/java/com/fangpeng/netty/chat/server/service/UserServiceFactory.java deleted file mode 100644 index d4ad6a19..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/service/UserServiceFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.netty.chat.server.service; - -public abstract class UserServiceFactory { - - private static UserService userService = new UserServiceMemoryImpl(); - - public static UserService getUserService() { - return userService; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/service/UserServiceMemoryImpl.java b/src/main/java/com/fangpeng/netty/chat/server/service/UserServiceMemoryImpl.java deleted file mode 100644 index ae0e4cb4..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/service/UserServiceMemoryImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fangpeng.netty.chat.server.service; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class UserServiceMemoryImpl implements UserService { - private Map allUserMap = new ConcurrentHashMap<>(); - - { - allUserMap.put("zhangsan", "123"); - allUserMap.put("lisi", "123"); - allUserMap.put("wangwu", "123"); - allUserMap.put("zhaoliu", "123"); - allUserMap.put("qianqi", "123"); - allUserMap.put("kobe", "123456"); - } - - @Override - public boolean login(String username, String password) { - String pass = allUserMap.get(username); - if (pass == null) { - return false; - } - return pass.equals(password); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/Group.java b/src/main/java/com/fangpeng/netty/chat/server/session/Group.java deleted file mode 100644 index 736fa838..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/Group.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - -import lombok.Data; - -import java.util.Collections; -import java.util.Set; - -@Data -/** - * 聊天组,即聊天室 - */ -public class Group { - // 聊天室名称 - private String name; - // 聊天室成员 - private Set members; - - public static final Group EMPTY_GROUP = new Group("empty", Collections.emptySet()); - - public Group(String name, Set members) { - this.name = name; - this.members = members; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/GroupSession.java b/src/main/java/com/fangpeng/netty/chat/server/session/GroupSession.java deleted file mode 100644 index 38fd5e47..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/GroupSession.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - -import io.netty.channel.Channel; - -import java.util.List; -import java.util.Set; - -/** - * 聊天组会话管理接口 - */ -public interface GroupSession { - - /** - * 创建一个聊天组, 如果不存在才能创建成功, 否则返回 null - * @param name 组名 - * @param members 成员 - * @return 成功时返回组对象, 失败返回 null - */ - Group createGroup(String name, Set members); - - /** - * 加入聊天组 - * @param name 组名 - * @param member 成员名 - * @return 如果组不存在返回 null, 否则返回组对象 - */ - Group joinMember(String name, String member); - - /** - * 移除组成员 - * @param name 组名 - * @param member 成员名 - * @return 如果组不存在返回 null, 否则返回组对象 - */ - Group removeMember(String name, String member); - - /** - * 移除聊天组 - * @param name 组名 - * @return 如果组不存在返回 null, 否则返回组对象 - */ - Group removeGroup(String name); - - /** - * 获取组成员 - * @param name 组名 - * @return 成员集合, 没有成员会返回 empty set - */ - Set getMembers(String name); - - /** - * 获取组成员的 channel 集合, 只有在线的 channel 才会返回 - * @param name 组名 - * @return 成员 channel 集合 - */ - List getMembersChannel(String name); -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/GroupSessionFactory.java b/src/main/java/com/fangpeng/netty/chat/server/session/GroupSessionFactory.java deleted file mode 100644 index d4d65547..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/GroupSessionFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - -public abstract class GroupSessionFactory { - - private static GroupSession session = new GroupSessionMemoryImpl(); - - public static GroupSession getGroupSession() { - return session; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/GroupSessionMemoryImpl.java b/src/main/java/com/fangpeng/netty/chat/server/session/GroupSessionMemoryImpl.java deleted file mode 100644 index df9d0fae..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/GroupSessionMemoryImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - -import io.netty.channel.Channel; - -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -public class GroupSessionMemoryImpl implements GroupSession { - private final Map groupMap = new ConcurrentHashMap<>(); - - @Override - public Group createGroup(String name, Set members) { - Group group = new Group(name, members); - return groupMap.putIfAbsent(name, group); - } - - @Override - public Group joinMember(String name, String member) { - return groupMap.computeIfPresent(name, (key, value) -> { - value.getMembers().add(member); - return value; - }); - } - - @Override - public Group removeMember(String name, String member) { - return groupMap.computeIfPresent(name, (key, value) -> { - value.getMembers().remove(member); - return value; - }); - } - - @Override - public Group removeGroup(String name) { - return groupMap.remove(name); - } - - @Override - public Set getMembers(String name) { - return groupMap.getOrDefault(name, Group.EMPTY_GROUP).getMembers(); - } - - @Override - public List getMembersChannel(String name) { - return getMembers(name).stream() - .map(member -> SessionFactory.getSession().getChannel(member)) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/Session.java b/src/main/java/com/fangpeng/netty/chat/server/session/Session.java deleted file mode 100644 index 331ae989..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/Session.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - - -import io.netty.channel.Channel; - -/** - * 会话管理接口 - */ -public interface Session { - - /** - * 绑定会话 - * @param channel 哪个 channel 要绑定会话 - * @param username 会话绑定用户 - */ - void bind(Channel channel, String username); - - /** - * 解绑会话 - * @param channel 哪个 channel 要解绑会话 - */ - void unbind(Channel channel); - - /** - * 获取属性 - * @param channel 哪个 channel - * @param name 属性名 - * @return 属性值 - */ - Object getAttribute(Channel channel, String name); - - /** - * 设置属性 - * @param channel 哪个 channel - * @param name 属性名 - * @param value 属性值 - */ - void setAttribute(Channel channel, String name, Object value); - - /** - * 根据用户名获取 channel - * @param username 用户名 - * @return channel - */ - Channel getChannel(String username); -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/SessionFactory.java b/src/main/java/com/fangpeng/netty/chat/server/session/SessionFactory.java deleted file mode 100644 index 4891467d..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/SessionFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - -public abstract class SessionFactory { - - private static Session session = new SessionMemoryImpl(); - - public static Session getSession() { - return session; - } -} diff --git a/src/main/java/com/fangpeng/netty/chat/server/session/SessionMemoryImpl.java b/src/main/java/com/fangpeng/netty/chat/server/session/SessionMemoryImpl.java deleted file mode 100644 index 9d081099..00000000 --- a/src/main/java/com/fangpeng/netty/chat/server/session/SessionMemoryImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.fangpeng.netty.chat.server.session; - -import io.netty.channel.Channel; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class SessionMemoryImpl implements Session { - - private final Map usernameChannelMap = new ConcurrentHashMap<>(); - private final Map channelUsernameMap = new ConcurrentHashMap<>(); - private final Map> channelAttributesMap = new ConcurrentHashMap<>(); - - @Override - public void bind(Channel channel, String username) { - usernameChannelMap.put(username, channel); - channelUsernameMap.put(channel, username); - channelAttributesMap.put(channel, new ConcurrentHashMap<>()); - } - - @Override - public void unbind(Channel channel) { - String username = channelUsernameMap.remove(channel); - usernameChannelMap.remove(username); - channelAttributesMap.remove(channel); - } - - @Override - public Object getAttribute(Channel channel, String name) { - return channelAttributesMap.get(channel).get(name); - } - - @Override - public void setAttribute(Channel channel, String name, Object value) { - channelAttributesMap.get(channel).put(name, value); - } - - @Override - public Channel getChannel(String username) { - return usernameChannelMap.get(username); - } - - @Override - public String toString() { - return usernameChannelMap.toString(); - } -} diff --git a/src/main/java/com/fangpeng/netty/demo/ByteBufTest.java b/src/main/java/com/fangpeng/netty/demo/ByteBufTest.java deleted file mode 100644 index 4b88bc80..00000000 --- a/src/main/java/com/fangpeng/netty/demo/ByteBufTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; - -/** - * @author 方鹏 - * @date 2022年01月21日 12:31 上午 - */ -public class ByteBufTest { - public static void main(String[] args) { - ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(9, 100); - - print("allocate ByteBuf(9, 100)", buffer); - - // write 方法改变写指针,写完之后写指针未到 capacity 的时候,buffer 仍然可写 - buffer.writeBytes(new byte[]{1, 2, 3, 4}); - print("writeBytes(1,2,3,4)", buffer); - - // write 方法改变写指针,写完之后写指针未到 capacity 的时候,buffer 仍然可写, 写完 int 类型之后,写指针增加4 - buffer.writeInt(12); - print("writeInt(12)", buffer); - - // write 方法改变写指针, 写完之后写指针等于 capacity 的时候,buffer 不可写 - buffer.writeBytes(new byte[]{5}); - print("writeBytes(5)", buffer); - - // write 方法改变写指针,写的时候发现 buffer 不可写则开始扩容,扩容之后 capacity 随即改变 - buffer.writeBytes(new byte[]{6}); - print("writeBytes(6)", buffer); - - // get 方法不改变读写指针 - System.out.println("getByte(3) return: " + buffer.getByte(3)); - System.out.println("getShort(3) return: " + buffer.getShort(3)); - System.out.println("getInt(3) return: " + buffer.getInt(3)); - print("getByte()", buffer); - - - // set 方法不改变读写指针 - buffer.setByte(buffer.readableBytes() + 1, 0); - print("setByte()", buffer); - - // read 方法改变读指针 - byte[] dst = new byte[buffer.readableBytes()]; - buffer.readBytes(dst); - print("readBytes(" + dst.length + ")", buffer); - - } - - private static void print(String action, ByteBuf buffer) { - System.out.println("after ===========" + action + "============"); - System.out.println("capacity(): " + buffer.capacity()); - System.out.println("maxCapacity(): " + buffer.maxCapacity()); - System.out.println("readerIndex(): " + buffer.readerIndex()); - System.out.println("readableBytes(): " + buffer.readableBytes()); - System.out.println("isReadable(): " + buffer.isReadable()); - System.out.println("writerIndex(): " + buffer.writerIndex()); - System.out.println("writableBytes(): " + buffer.writableBytes()); - System.out.println("isWritable(): " + buffer.isWritable()); - System.out.println("maxWritableBytes(): " + buffer.maxWritableBytes()); - System.out.println(); - } -} diff --git a/src/main/java/com/fangpeng/netty/demo/ByteBufTest2.java b/src/main/java/com/fangpeng/netty/demo/ByteBufTest2.java deleted file mode 100644 index 92d5da50..00000000 --- a/src/main/java/com/fangpeng/netty/demo/ByteBufTest2.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; - -import static io.netty.buffer.ByteBufUtil.appendPrettyHexDump; -import static io.netty.util.internal.StringUtil.NEWLINE; - -/** - * @author 方鹏 - * @date 2022年01月26日 12:03 上午 - */ -public class ByteBufTest2 { - - public static void main(String[] args) { - - ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(); - System.out.println(buf.getClass()); - System.out.println(buf.maxCapacity()); - log(buf); - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 32; i++) { - sb.append("a"); - } - buf.writeBytes(sb.toString().getBytes()); - log(buf); - } - - public static void log(ByteBuf buffer) { - int length = buffer.readableBytes(); - int rows = length / 16 + (length % 15 == 0 ? 0 : 1) + 4; - StringBuilder buf = new StringBuilder(rows * 80 * 2) - .append("read index:").append(buffer.readerIndex()) - .append(" write index:").append(buffer.writerIndex()) - .append(" capacity:").append(buffer.capacity()) - .append(NEWLINE); - appendPrettyHexDump(buf, buffer); - System.out.println(buf.toString()); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/CloseFutureClient.java b/src/main/java/com/fangpeng/netty/demo/CloseFutureClient.java deleted file mode 100644 index f77805c1..00000000 --- a/src/main/java/com/fangpeng/netty/demo/CloseFutureClient.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelFutureListener; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.string.StringEncoder; -import lombok.extern.slf4j.Slf4j; - -import java.net.InetSocketAddress; -import java.util.Scanner; - -/** - * @author 方鹏 - * @date 2022年01月25日 10:35 下午 - */ -@Slf4j -public class CloseFutureClient { - - public static void main(String[] args) throws InterruptedException { - NioEventLoopGroup group = new NioEventLoopGroup(); - ChannelFuture channelFuture = new Bootstrap() - .group(group) - .channel(NioSocketChannel.class) - .handler(new ChannelInitializer() { - @Override // 在连接建立后被调用 - protected void initChannel(NioSocketChannel ch) throws Exception { -// ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - ch.pipeline().addLast(new StringEncoder()); - } - }) - .connect(new InetSocketAddress("localhost", 8080)); - System.out.println(channelFuture.getClass()); - Channel channel = channelFuture.sync().channel(); - log.debug("{}", channel); - new Thread(()->{ - Scanner scanner = new Scanner(System.in); - while (true) { - String line = scanner.nextLine(); - if ("q".equals(line)) { - channel.close(); // close 异步操作 1s 之后 -// log.debug("处理关闭之后的操作"); // 不能在这里善后 - break; - } - channel.writeAndFlush(line); - } - }, "input").start(); - - // 获取 CloseFuture 对象, 1) 同步处理关闭, 2) 异步处理关闭 - ChannelFuture closeFuture = channel.closeFuture(); - /*log.debug("waiting close..."); - closeFuture.sync(); - log.debug("处理关闭之后的操作");*/ - System.out.println(closeFuture.getClass()); - closeFuture.addListener((ChannelFutureListener) future -> { - log.debug("处理关闭之后的操作"); - group.shutdownGracefully(); - }); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/CompositeByteBuf.java b/src/main/java/com/fangpeng/netty/demo/CompositeByteBuf.java deleted file mode 100644 index 6edc8ce9..00000000 --- a/src/main/java/com/fangpeng/netty/demo/CompositeByteBuf.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; - -import static com.fangpeng.netty.demo.ByteBufTest2.log; - -/** - * 组合buffer - * @author 方鹏 - * @date 2022年01月26日 12:43 上午 - */ -public class CompositeByteBuf { - - public static void main(String[] args) { - ByteBuf buf1 = ByteBufAllocator.DEFAULT.buffer(); - buf1.writeBytes(new byte[]{1, 2, 3, 4, 5}); - - ByteBuf buf2 = ByteBufAllocator.DEFAULT.buffer(); - buf2.writeBytes(new byte[]{6, 7, 8, 9, 10}); - - - /*ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(); - buffer.writeBytes(buf1).writeBytes(buf2); - log(buffer);*/ - - io.netty.buffer.CompositeByteBuf buffer = ByteBufAllocator.DEFAULT.compositeBuffer(); - buffer.addComponents(true, buf1, buf2); - log(buffer); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/EmbeddedChannelTest.java b/src/main/java/com/fangpeng/netty/demo/EmbeddedChannelTest.java deleted file mode 100644 index 601fde8c..00000000 --- a/src/main/java/com/fangpeng/netty/demo/EmbeddedChannelTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.buffer.ByteBufAllocator; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelOutboundHandlerAdapter; -import io.netty.channel.ChannelPromise; -import io.netty.channel.embedded.EmbeddedChannel; -import lombok.extern.slf4j.Slf4j; - -/** - * @author 方鹏 - * @date 2022年01月25日 11:59 下午 - */ -@Slf4j -public class EmbeddedChannelTest { - - public static void main(String[] args) { - ChannelInboundHandlerAdapter h1 = new ChannelInboundHandlerAdapter() { - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - log.debug("1"); - super.channelRead(ctx, msg); - } - }; - ChannelInboundHandlerAdapter h2 = new ChannelInboundHandlerAdapter() { - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - log.debug("2"); - super.channelRead(ctx, msg); - } - }; - ChannelOutboundHandlerAdapter h3 = new ChannelOutboundHandlerAdapter() { - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - log.debug("3"); - super.write(ctx, msg, promise); - } - }; - ChannelOutboundHandlerAdapter h4 = new ChannelOutboundHandlerAdapter() { - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - log.debug("4"); - super.write(ctx, msg, promise); - } - }; - EmbeddedChannel channel = new EmbeddedChannel(h1, h2, h3, h4); - // 模拟入站操作 -// channel.writeInbound(ByteBufAllocator.DEFAULT.buffer().writeBytes("hello".getBytes())); - // 模拟出站操作 - channel.writeOutbound(ByteBufAllocator.DEFAULT.buffer().writeBytes("world".getBytes())); - - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/EventLoopClient.java b/src/main/java/com/fangpeng/netty/demo/EventLoopClient.java deleted file mode 100644 index 453d3691..00000000 --- a/src/main/java/com/fangpeng/netty/demo/EventLoopClient.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelFutureListener; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.string.StringEncoder; -import lombok.extern.slf4j.Slf4j; - -import java.net.InetSocketAddress; - -/** - * @author 方鹏 - * @date 2022年01月24日 5:16 下午 - */ -@Slf4j -public class EventLoopClient { - - public static void main(String[] args) throws InterruptedException { - // 2. 带有 Future,Promise 的类型都是和异步方法配套使用,用来处理结果 - ChannelFuture channelFuture = new Bootstrap() - .group(new NioEventLoopGroup()) - .channel(NioSocketChannel.class) - .handler(new ChannelInitializer() { - @Override // 在连接建立后被调用 - protected void initChannel(NioSocketChannel ch) throws Exception { - ch.pipeline().addLast(new StringEncoder()); - } - }) - // 1. 连接到服务器 - // 异步非阻塞, main 发起了调用,真正执行 connect 是 nio 线程 - .connect(new InetSocketAddress("localhost", 8080)); // 1s 秒后 - - // 2.1 使用 sync 方法同步处理结果 - /*channelFuture.sync(); // 阻塞住当前线程,直到nio线程连接建立完毕 - Channel channel = channelFuture.channel(); - log.debug("{}", channel); - channel.writeAndFlush("hello, world");*/ - - // 2.2 使用 addListener(回调对象) 方法异步处理结果 - channelFuture.addListener(new ChannelFutureListener() { - @Override - // 在 nio 线程连接建立好之后,会调用 operationComplete - public void operationComplete(ChannelFuture future) throws Exception { - Channel channel = future.channel(); - log.debug("{}", channel); - channel.writeAndFlush("hello, world"); - } - }); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/EventLoopServer.java b/src/main/java/com/fangpeng/netty/demo/EventLoopServer.java deleted file mode 100644 index 2525da4e..00000000 --- a/src/main/java/com/fangpeng/netty/demo/EventLoopServer.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import lombok.extern.slf4j.Slf4j; - -import java.nio.charset.Charset; - -/** - * @author 方鹏 - * @date 2022年01月24日 5:14 下午 - */ -@Slf4j -public class EventLoopServer { - - public static void main(String[] args) { - // 细分2:创建一个独立的 EventLoopGroup - EventLoopGroup group = new DefaultEventLoopGroup(); - new ServerBootstrap() - // boss 和 worker - // 细分1:boss 只负责 ServerSocketChannel 上 accept 事件 worker 只负责 socketChannel 上的读写 - .group(new NioEventLoopGroup(), new NioEventLoopGroup(2)) - .channel(NioServerSocketChannel.class) - .childHandler(new ChannelInitializer() { - @Override - protected void initChannel(NioSocketChannel ch) throws Exception { - ch.pipeline().addLast("handler1", new ChannelInboundHandlerAdapter() { - @Override // ByteBuf - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - ByteBuf buf = (ByteBuf) msg; - log.debug(buf.toString(Charset.defaultCharset())); - ctx.fireChannelRead(msg); // 让消息传递给下一个handler - } - }); - /*.addLast(group, "handler2", new ChannelInboundHandlerAdapter() { - @Override // ByteBuf - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - ByteBuf buf = (ByteBuf) msg; - log.debug(buf.toString(Charset.defaultCharset())); - } - });*/ - } - }) - .bind(8080); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/EventLoopTest.java b/src/main/java/com/fangpeng/netty/demo/EventLoopTest.java deleted file mode 100644 index 9170faff..00000000 --- a/src/main/java/com/fangpeng/netty/demo/EventLoopTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.TimeUnit; - -/** - * @author 方鹏 - * @date 2022年01月24日 5:09 下午 - */ -@Slf4j -public class EventLoopTest { - - public static void main(String[] args) { - // 1. 创建事件循环组 - EventLoopGroup group = new NioEventLoopGroup(2); // io 事件,普通任务,定时任务 -// EventLoopGroup group = new DefaultEventLoopGroup(); // 普通任务,定时任务 - // 2. 获取下一个事件循环对象 - System.out.println(group.next()); - System.out.println(group.next()); - System.out.println(group.next()); - System.out.println(group.next()); - - // 3. 执行普通任务 - /*group.next().execute(() -> { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - log.debug("ok"); - });*/ - - // 4. 执行定时任务 - group.next().scheduleAtFixedRate(() -> { - log.debug("ok"); - }, 0, 1, TimeUnit.SECONDS); - - log.debug("main"); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/HelloClient.java b/src/main/java/com/fangpeng/netty/demo/HelloClient.java deleted file mode 100644 index 23d5b971..00000000 --- a/src/main/java/com/fangpeng/netty/demo/HelloClient.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.string.StringEncoder; - -import java.net.InetSocketAddress; - -/** - * @author 方鹏 - * @date 2022年01月24日 4:36 下午 - */ -public class HelloClient { - - public static void main(String[] args) throws InterruptedException { - // 1. 启动类 - new Bootstrap() - // 2. 添加 EventLoop - .group(new NioEventLoopGroup()) - // 3. 选择客户端 channel 实现 - .channel(NioSocketChannel.class) - // 4. 添加处理器 - .handler(new ChannelInitializer() { - @Override // 在连接建立后被调用 - protected void initChannel(NioSocketChannel ch) throws Exception { - ch.pipeline().addLast(new StringEncoder()); - } - }) - // 5. 连接到服务器 - .connect(new InetSocketAddress("localhost", 8080)) - .sync() // 阻塞方法,直到连接建立 - .channel() - // 6. 向服务器发送数据 - .writeAndFlush("hello, world"); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/HelloServer.java b/src/main/java/com/fangpeng/netty/demo/HelloServer.java deleted file mode 100644 index f521ea36..00000000 --- a/src/main/java/com/fangpeng/netty/demo/HelloServer.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.logging.LoggingHandler; - -/** - * @author 方鹏 - * @date 2022年01月24日 4:31 下午 - */ -public class HelloServer { - - public static void main(String[] args) { - // 1. 启动器,负责组装 netty 组件,启动服务器 - new ServerBootstrap() - // 2. BossEventLoop, WorkerEventLoop(selector,thread), group 组 - .group(new NioEventLoopGroup()) - // 3. 选择 服务器的 ServerSocketChannel 实现 - .channel(NioServerSocketChannel.class) // OIO BIO - // 4. boss 负责处理连接 worker(child) 负责处理读写,决定了 worker(child) 能执行哪些操作(handler) - .childHandler( - // 5. channel 代表和客户端进行数据读写的通道 Initializer 初始化,负责添加别的 handler - new ChannelInitializer() { - @Override - protected void initChannel(NioSocketChannel ch) throws Exception { - // 6. 添加具体 handler - ch.pipeline().addLast(new LoggingHandler()); - ch.pipeline().addLast(new StringDecoder()); // 将 ByteBuf 转换为字符串 - ch.pipeline().addLast(new ChannelInboundHandlerAdapter() { // 自定义 handler - @Override // 读事件 - public void channelRead(ChannelHandlerContext ctx,Object msg) throws Exception { - System.out.println(msg); // 打印上一步转换好的字符串 - } - }); - } - }) - // 7. 绑定监听端口 - .bind(8080); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/JdkFuture.java b/src/main/java/com/fangpeng/netty/demo/JdkFuture.java deleted file mode 100644 index 3c792520..00000000 --- a/src/main/java/com/fangpeng/netty/demo/JdkFuture.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fangpeng.netty.demo; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.*; - -/** - * @author 方鹏 - * @date 2022年01月25日 11:11 下午 - */ -@Slf4j -public class JdkFuture { - - public static void main(String[] args) throws ExecutionException, InterruptedException { - // 1. 线程池 - ExecutorService service = Executors.newFixedThreadPool(2); - // 2. 提交任务 - Future future = service.submit(new Callable() { - @Override - public Integer call() throws Exception { - log.debug("执行计算"); - Thread.sleep(1000); - return 50; - } - }); - // 3. 主线程通过 future 来获取结果 - log.debug("等待结果"); - log.debug("结果是 {}", future.get()); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/NettyClient.java b/src/main/java/com/fangpeng/netty/demo/NettyClient.java deleted file mode 100644 index d9b20458..00000000 --- a/src/main/java/com/fangpeng/netty/demo/NettyClient.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.string.StringEncoder; -import io.netty.util.concurrent.EventExecutorGroup; - -import java.nio.charset.Charset; -import java.util.Date; - -/** - * @author 方鹏 - * @date 2022年01月20日 11:03 下午 - */ -public class NettyClient { - - public static void main(String[] args) throws InterruptedException { - Bootstrap bootstrap = new Bootstrap(); - NioEventLoopGroup group = new NioEventLoopGroup(); - - bootstrap.group(group) - .channel(NioSocketChannel.class) - .handler(new ChannelInitializer() { - @Override - protected void initChannel(Channel ch) { - // 指定连接数据读写逻辑 - ch.pipeline().addLast(new FirstClientHandler()); - } - }); - - Channel channel = bootstrap.connect("127.0.0.1", 8000).channel(); - - //while (true) { - // channel.writeAndFlush(new Date() + ": hello world!"); - // Thread.sleep(2000); - //} - } - - private static class FirstClientHandler extends ChannelInboundHandlerAdapter { - - @Override - public void channelActive(ChannelHandlerContext ctx) { - System.out.println(new Date() + ": 客户端写出数据"); - - // 1. 获取数据 - ByteBuf buffer = getByteBuf(ctx); - - // 2. 写数据 - ctx.channel().writeAndFlush(buffer); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) { - ByteBuf byteBuf = (ByteBuf) msg; - - System.out.println(new Date() + ": 客户端读到数据 -> " + byteBuf.toString(Charset.forName("utf-8"))); - } - - private ByteBuf getByteBuf(ChannelHandlerContext ctx) { - // 1. 获取二进制抽象 ByteBuf - ByteBuf buffer = ctx.alloc().buffer(); - - // 2. 准备数据,指定字符串的字符集为 utf-8 - byte[] bytes = "你好,Lemon!".getBytes(Charset.forName("utf-8")); - - // 3. 填充数据到 ByteBuf - buffer.writeBytes(bytes); - - return buffer; - } - - } -} diff --git a/src/main/java/com/fangpeng/netty/demo/NettyFuture.java b/src/main/java/com/fangpeng/netty/demo/NettyFuture.java deleted file mode 100644 index ad602232..00000000 --- a/src/main/java/com/fangpeng/netty/demo/NettyFuture.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.channel.ChannelFutureListener; -import io.netty.channel.EventLoop; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.util.concurrent.Future; -import io.netty.util.concurrent.GenericFutureListener; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; - -/** - * @author 方鹏 - * @date 2022年01月25日 11:19 下午 - */ -@Slf4j -public class NettyFuture { - - public static void main(String[] args) { - NioEventLoopGroup group = new NioEventLoopGroup(2); - EventLoop eventLoop = group.next(); - - Future future = eventLoop.submit(new Callable() { - @Override - public Integer call() throws Exception { - log.debug("执行计算"); - TimeUnit.SECONDS.sleep(1); - return 70; - } - }); - // log.debug("等待结果"); - // log.debug("结果是 {}", future.get()); - - future.addListener(new GenericFutureListener>() { - @Override - public void operationComplete(Future future) throws Exception { - log.debug("接收结果:{}", future.getNow()); - } - }); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/NettyPromise.java b/src/main/java/com/fangpeng/netty/demo/NettyPromise.java deleted file mode 100644 index 4da09505..00000000 --- a/src/main/java/com/fangpeng/netty/demo/NettyPromise.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.channel.EventLoop; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.util.concurrent.DefaultPromise; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ExecutionException; - -/** - * @author 方鹏 - * @date 2022年01月25日 11:24 下午 - */ -@Slf4j -public class NettyPromise { - - public static void main(String[] args) throws ExecutionException, InterruptedException { - // 1. 准备 EventLoop 对象 - EventLoop eventLoop = new NioEventLoopGroup().next(); - // 2. 可以主动创建 promise, 结果容器 - DefaultPromise promise = new DefaultPromise<>(eventLoop); - new Thread(() -> { - // 3. 任意一个线程执行计算,计算完毕后向 promise 填充结果 - log.debug("开始计算..."); - try { - int i = 1 / 0; - Thread.sleep(1000); - promise.setSuccess(80); - } catch (Exception e) { - e.printStackTrace(); - promise.setFailure(e); - } - - }).start(); - // 4. 接收结果的线程 - log.debug("等待结果..."); - log.debug("结果是: {}", promise.get()); - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/NettyServer.java b/src/main/java/com/fangpeng/netty/demo/NettyServer.java deleted file mode 100644 index 51e46eef..00000000 --- a/src/main/java/com/fangpeng/netty/demo/NettyServer.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.util.concurrent.Future; -import io.netty.util.concurrent.GenericFutureListener; - -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.Date; - -/** - * @author 方鹏 - * @date 2022年01月20日 10:59 下午 - */ -public class NettyServer { - - public static void main(String[] args) { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - - NioEventLoopGroup boss = new NioEventLoopGroup(); - NioEventLoopGroup worker = new NioEventLoopGroup(); - serverBootstrap - .group(boss, worker) - .channel(NioServerSocketChannel.class) - .childHandler(new ChannelInitializer() { - @Override - protected void initChannel(NioSocketChannel ch) { - // 指定连接数据读写逻辑 - ch.pipeline().addLast(new FirstServerHandler()); - //ch.pipeline().addLast(new StringDecoder()); - //ch.pipeline().addLast(new SimpleChannelInboundHandler() { - // @Override - // protected void channelRead0(ChannelHandlerContext ctx, String msg) { - // System.out.println(msg); - // } - //}); - } - }); - - bind(serverBootstrap, 8000); - - //serverBootstrap.bind(8000).addListener(new GenericFutureListener>() { - // public void operationComplete(Future future) { - // if (future.isSuccess()) { - // System.out.println("端口绑定成功!"); - // } else { - // System.err.println("端口绑定失败!"); - // } - // } - //}); - } - - private static void bind(final ServerBootstrap serverBootstrap, final int port) { - serverBootstrap.bind(port).addListener(new GenericFutureListener>() { - @Override - public void operationComplete(Future future) { - if (future.isSuccess()) { - System.out.println("端口[" + port + "]绑定成功!"); - } else { - System.err.println("端口[" + port + "]绑定失败!"); - bind(serverBootstrap, port + 1); - } - } - }); - } - - private static class FirstServerHandler extends ChannelInboundHandlerAdapter { - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) { - ByteBuf byteBuf = (ByteBuf) msg; - - System.out.println(new Date() + ": 服务端读到数据 -> " + byteBuf.toString(Charset.forName("utf-8"))); - - // 回复数据到客户端 - System.out.println(new Date() + ": 服务端写出数据"); - - ByteBuf out = getByteBuf(ctx); - ctx.channel().writeAndFlush(out); - } - - private ByteBuf getByteBuf(ChannelHandlerContext ctx) { - byte[] bytes = "你好,欢迎来到Lemon-CS".getBytes(StandardCharsets.UTF_8); - - ByteBuf byteBuf = ctx.alloc().buffer(); - - byteBuf.writeBytes(bytes); - return byteBuf; - } - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/PipelineTest.java b/src/main/java/com/fangpeng/netty/demo/PipelineTest.java deleted file mode 100644 index 650e11eb..00000000 --- a/src/main/java/com/fangpeng/netty/demo/PipelineTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.*; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -/** - * @author 方鹏 - * @date 2022年01月25日 11:32 下午 - */ -@Slf4j -public class PipelineTest { - - public static void main(String[] args) { - new ServerBootstrap() - .group(new NioEventLoopGroup()) - .channel(NioServerSocketChannel.class) - .childHandler(new ChannelInitializer() { - @Override - protected void initChannel(NioSocketChannel ch) throws Exception { - // 1. 通过 channel 拿到 pipeline - ChannelPipeline pipeline = ch.pipeline(); - // 2. 添加处理器 head -> h1 -> h2 -> h4 -> h3 -> h5 -> h6 -> tail - pipeline.addLast("h1", new ChannelInboundHandlerAdapter() { - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - log.debug("1"); - super.channelRead(ctx, msg); - } - }); - pipeline.addLast("h2", new ChannelInboundHandlerAdapter(){ - @Override - public void channelRead(ChannelHandlerContext ctx, Object name) throws Exception { - log.debug("2"); - super.channelRead(ctx, name); // 将数据传递给下个 handler,如果不调用,调用链会断开 或者调用 ctx.fireChannelRead(student); - } - }); - - pipeline.addLast("h3", new ChannelInboundHandlerAdapter(){ - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - log.debug("3"); - ctx.writeAndFlush(ctx.alloc().buffer().writeBytes("server...".getBytes())); -// ch.writeAndFlush(ctx.alloc().buffer().writeBytes("server...".getBytes())); - } - }); - pipeline.addLast("h4", new ChannelOutboundHandlerAdapter(){ - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - log.debug("4"); - super.write(ctx, msg, promise); - } - }); - pipeline.addLast("h5", new ChannelOutboundHandlerAdapter(){ - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - log.debug("5"); - super.write(ctx, msg, promise); - } - }); - pipeline.addLast("h6", new ChannelOutboundHandlerAdapter(){ - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - log.debug("6"); - super.write(ctx, msg, promise); - } - }); - } - }) - .bind(8080); - } - - @Data - @AllArgsConstructor - static class Student { - private String name; - } - -} diff --git a/src/main/java/com/fangpeng/netty/demo/SliceTest.java b/src/main/java/com/fangpeng/netty/demo/SliceTest.java deleted file mode 100644 index 7db17d9e..00000000 --- a/src/main/java/com/fangpeng/netty/demo/SliceTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.fangpeng.netty.demo; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; - -import static com.fangpeng.netty.demo.ByteBufTest2.log; - -/** - * @author 方鹏 - * @date 2022年01月26日 12:35 上午 - */ -public class SliceTest { - - public static void main(String[] args) { - ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(10); - buf.writeBytes(new byte[]{'a','b','c','d','e','f','g','h','i','j'}); - log(buf); - - // 在切片过程中,没有发生数据复制 - ByteBuf f1 = buf.slice(0, 5); - f1.retain(); - // 'a','b','c','d','e', 'x' - ByteBuf f2 = buf.slice(5, 5); - f2.retain(); - log(f1); - log(f2); - - System.out.println("释放原有 byteBuf 内存"); - buf.release(); - log(f1); - - - f1.release(); - f2.release(); - /*System.out.println("========================"); - f1.setByte(0, 'b'); - log(f1); - log(buf);*/ - } - -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/BeanDefinition.java b/src/main/java/com/fangpeng/spring/framework/beans/BeanDefinition.java deleted file mode 100644 index f53497df..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/BeanDefinition.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.fangpeng.spring.framework.beans; - -/** - * @Description: 用来封装bean标签数据 - * 1. id属性 - * 2. class属性 - * 3. property子标签的数据 - * @Author : Lemon-CS - * @Date : 2022年02月10日 5:35 下午 - */ -public class BeanDefinition { - - private String id; - private String className; - - private MutablePropertyValues propertyValues; - - public BeanDefinition() { - propertyValues = new MutablePropertyValues(); - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getClassName() { - return className; - } - - public void setClassName(String className) { - this.className = className; - } - - public MutablePropertyValues getPropertyValues() { - return propertyValues; - } - - public void setPropertyValues(MutablePropertyValues propertyValues) { - this.propertyValues = propertyValues; - } - -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/MutablePropertyValues.java b/src/main/java/com/fangpeng/spring/framework/beans/MutablePropertyValues.java deleted file mode 100644 index 530b537d..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/MutablePropertyValues.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.fangpeng.spring.framework.beans; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * @author : Lemon-CS - * @description: 用户存储和管理多个PropertyValue对象 - * @date : 2022年02月10日 5:05 下午 - */ -public class MutablePropertyValues implements Iterable { - - //定义list集合对象,用来存储PropertyValue对象 - private final List propertyValueList; - - public MutablePropertyValues() { - this.propertyValueList = new ArrayList<>(); - } - - public MutablePropertyValues(List propertyValueList) { - if (propertyValueList == null) { - this.propertyValueList = new ArrayList<>(); - } else { - this.propertyValueList = propertyValueList; - } - } - - //获取所有的PropertyValue对象,返回以数组的形式 - public PropertyValue[] getPropertyValues() { - //将集合转换为数组并返回 - return propertyValueList.toArray(new PropertyValue[0]); - } - - //根据name属性值获取PropertyValue对象 - public PropertyValue getPropertyValue(String propertyName) { - //遍历集合对象 - for (PropertyValue propertyValue : propertyValueList) { - if (propertyValue.getName().equals(propertyName)) { - return propertyValue; - } - } - return null; - } - - //判断集合是否为空 - public boolean isEmpty() { - return propertyValueList.isEmpty(); - } - - //添加PropertyValue对象 - public MutablePropertyValues addPropertyValue(PropertyValue pv) { - //判断集合中存储的PropertyValue对象是否和传递进行的重复了,如果重复了,进行覆盖 - for (int i = 0; i < propertyValueList.size(); i++) { - //获取集合中每一个PropertyValue对象 - PropertyValue currentPv = propertyValueList.get(i); - - if (currentPv.getName().equals(pv.getName())) { - propertyValueList.set(i, pv); - return this; //目的就是实现链式编程 - } - } - this.propertyValueList.add(pv); - return this; //目的就是实现链式编程 - } - - //判断是否有指定name属性值的对象 - public boolean contains(String propertyName) { - return getPropertyValue(propertyName) != null; - } - - // 获取迭代器对象 - @Override - public Iterator iterator() { - return propertyValueList.iterator(); - } -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/PropertyValue.java b/src/main/java/com/fangpeng/spring/framework/beans/PropertyValue.java deleted file mode 100644 index 8c776bbd..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/PropertyValue.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.fangpeng.spring.framework.beans; - -/** - * @author : Lemon-CS - * @description: 用来封装bean标签下的property标签的属性 - * 1. name属性 - * 2. ref属性 - * 3. value属性: 给基本数据类型及String类型数据赋的值 - * @date : 2022年02月10日 5:02 下午 - */ -public class PropertyValue { - - private String name; - private String ref; - private String value; - - public PropertyValue() { - } - - public PropertyValue(String name, String ref, String value) { - this.name = name; - this.ref = ref; - this.value = value; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getRef() { - return ref; - } - - public void setRef(String ref) { - this.ref = ref; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/factory/BeanFactory.java b/src/main/java/com/fangpeng/spring/framework/beans/factory/BeanFactory.java deleted file mode 100644 index c5fa2bcf..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/factory/BeanFactory.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.spring.framework.beans.factory; - -/** - * @Description: IOC容器父接口 - * @Author : Lemon-CS - * @Date : 2022年02月10日 6:14 下午 - */ -public interface BeanFactory { - - Object getBean(String name) throws Exception; - - T getBean(String name, Class clazz) throws Exception; - -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/factory/support/BeanDefinitionReader.java b/src/main/java/com/fangpeng/spring/framework/beans/factory/support/BeanDefinitionReader.java deleted file mode 100644 index 4c918007..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/factory/support/BeanDefinitionReader.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.spring.framework.beans.factory.support; - -/** - * @Description: 用来解析配置文件的,而该接口只是定义了规范 - * @Author : Lemon-CS - * @Date : 2022年02月10日 5:55 下午 - */ -public interface BeanDefinitionReader { - - //获取注册表对象 - BeanDefinitionRegistry getRegistry(); - - //加载配置文件并在注册表中进行注册 - void loadBeanDefinitions(String configLocation) throws Exception; - -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/factory/support/BeanDefinitionRegistry.java b/src/main/java/com/fangpeng/spring/framework/beans/factory/support/BeanDefinitionRegistry.java deleted file mode 100644 index 5951de3c..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/factory/support/BeanDefinitionRegistry.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fangpeng.spring.framework.beans.factory.support; - -import com.fangpeng.spring.framework.beans.BeanDefinition; - -/** - * @Description: 注册表对象 - * @Author : Lemon-CS - * @Date : 2022年02月10日 5:50 下午 - */ -public interface BeanDefinitionRegistry { - - //注册BeanDefinition对象到注册表中 - void registerBeanDefinition(String beanName, BeanDefinition beanDefinition); - - //从注册表中删除指定名称的BeanDefinition对象 - void removeBeanDefinition(String beanName) throws Exception; - - //根据名称从注册表中获取BeanDefinition对象 - BeanDefinition getBeanDefinition(String beanName) throws Exception; - - boolean containsBeanDefinition(String beanName); - - int getBeanDefinitionCount(); - - String[] getBeanDefinitionNames(); - -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/factory/support/SimpleBeanDefinitionRegistry.java b/src/main/java/com/fangpeng/spring/framework/beans/factory/support/SimpleBeanDefinitionRegistry.java deleted file mode 100644 index 3aa42c0e..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/factory/support/SimpleBeanDefinitionRegistry.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.fangpeng.spring.framework.beans.factory.support; - -import com.fangpeng.spring.framework.beans.BeanDefinition; - -import java.util.HashMap; -import java.util.Map; - -/** - * @Description: 注册表接口的子实现类 - * @Author : Lemon-CS - * @Date : 2022年02月10日 5:50 下午 - */ -public class SimpleBeanDefinitionRegistry implements BeanDefinitionRegistry { - - //定义一个容器,用来存储BeanDefinition对象 - private Map beanDefinitionMap = new HashMap<>(); - - @Override - public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) { - beanDefinitionMap.put(beanName, beanDefinition); - } - - @Override - public void removeBeanDefinition(String beanName) throws Exception { - beanDefinitionMap.remove(beanName); - } - - @Override - public BeanDefinition getBeanDefinition(String beanName) throws Exception { - return beanDefinitionMap.get(beanName); - } - - @Override - public boolean containsBeanDefinition(String beanName) { - return beanDefinitionMap.containsKey(beanName); - } - - @Override - public int getBeanDefinitionCount() { - return beanDefinitionMap.size(); - } - - @Override - public String[] getBeanDefinitionNames() { - return beanDefinitionMap.keySet().toArray(new String[0]); - } -} diff --git a/src/main/java/com/fangpeng/spring/framework/beans/factory/xml/XmlBeanDefinitionReader.java b/src/main/java/com/fangpeng/spring/framework/beans/factory/xml/XmlBeanDefinitionReader.java deleted file mode 100644 index bce38342..00000000 --- a/src/main/java/com/fangpeng/spring/framework/beans/factory/xml/XmlBeanDefinitionReader.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.fangpeng.spring.framework.beans.factory.xml; - -import com.fangpeng.spring.framework.beans.BeanDefinition; -import com.fangpeng.spring.framework.beans.MutablePropertyValues; -import com.fangpeng.spring.framework.beans.PropertyValue; -import com.fangpeng.spring.framework.beans.factory.support.BeanDefinitionReader; -import com.fangpeng.spring.framework.beans.factory.support.BeanDefinitionRegistry; -import com.fangpeng.spring.framework.beans.factory.support.SimpleBeanDefinitionRegistry; -import org.dom4j.Document; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; - -import java.io.InputStream; -import java.util.List; - -/** - * @Description: 针对xml配置文件进行解析的类 - * @Author : Lemon-CS - * @Date : 2022年02月10日 5:56 下午 - */ -public class XmlBeanDefinitionReader implements BeanDefinitionReader { - - //声明注册表对象 - private BeanDefinitionRegistry registry; - - public XmlBeanDefinitionReader() { - registry = new SimpleBeanDefinitionRegistry(); - } - - @Override - public BeanDefinitionRegistry getRegistry() { - return registry; - } - - @Override - public void loadBeanDefinitions(String configLocation) throws Exception { - //使用dom4j进行xml配置文件的解析 - SAXReader reader = new SAXReader(); - //获取类路径下的配置文件 - InputStream is = XmlBeanDefinitionReader.class.getClassLoader().getResourceAsStream(configLocation); - Document document = reader.read(is); - //根据Document对象获取根标签对象 (beans) - Element rootElement = document.getRootElement(); - //获取根标签下所有的bean标签对象 - List beanElements = rootElement.elements("bean"); - //遍历集合 - for (Element beanElement : beanElements) { - //获取id属性 - String id = beanElement.attributeValue("id"); - //获取id属性 - String className = beanElement.attributeValue("class"); - - //将id属性和class属性封装到BeanDefinition对象中 - //1. 创建BeanDefinition - BeanDefinition beanDefinition = new BeanDefinition(); - beanDefinition.setId(id); - beanDefinition.setClassName(className); - - //2. 创建MutablePropertyValues对象 - MutablePropertyValues mutablePropertyValues = new MutablePropertyValues(); - - //3. 获取bean标签下所有的property标签对象 - List propertyElements = beanElement.elements("property"); - - for (Element propertyElement : propertyElements) { - String name = propertyElement.attributeValue("name"); - String ref = propertyElement.attributeValue("ref"); - String value = propertyElement.attributeValue("value"); - PropertyValue propertyValue = new PropertyValue(name, ref, value); - mutablePropertyValues.addPropertyValue(propertyValue); - } - - //4. 将mutablePropertyValues对象封装到BeanDefinition对象中 - beanDefinition.setPropertyValues(mutablePropertyValues); - - //5. 将beanDefinition对象注册到注册表中 - registry.registerBeanDefinition(id, beanDefinition); - } - } -} diff --git a/src/main/java/com/fangpeng/spring/framework/context/ApplicationContext.java b/src/main/java/com/fangpeng/spring/framework/context/ApplicationContext.java deleted file mode 100644 index 238a2c17..00000000 --- a/src/main/java/com/fangpeng/spring/framework/context/ApplicationContext.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.fangpeng.spring.framework.context; - -import com.fangpeng.spring.framework.beans.factory.BeanFactory; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年02月10日 6:14 下午 - */ -public interface ApplicationContext extends BeanFactory { - - void refresh() throws Exception; - -} diff --git a/src/main/java/com/fangpeng/spring/framework/context/support/AbstractApplicationContext.java b/src/main/java/com/fangpeng/spring/framework/context/support/AbstractApplicationContext.java deleted file mode 100644 index e6c102e9..00000000 --- a/src/main/java/com/fangpeng/spring/framework/context/support/AbstractApplicationContext.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.fangpeng.spring.framework.context.support; - -import com.fangpeng.spring.framework.beans.factory.support.BeanDefinitionReader; -import com.fangpeng.spring.framework.beans.factory.support.BeanDefinitionRegistry; -import com.fangpeng.spring.framework.context.ApplicationContext; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @Description: ApplicationContext接口的子实现类,用于立即加载 - * @Author : Lemon-CS - * @Date : 2022年02月10日 6:16 下午 - */ -public abstract class AbstractApplicationContext implements ApplicationContext { - - //声明解析器变量 - protected BeanDefinitionReader beanDefinitionReader; - - //定义用于存储bean对象的map容器 - protected Map singletonMap = new HashMap<>(); - - //声明配置文件路径的变量 - protected String configLocation; - - - @Override - public void refresh() throws Exception { - //加载BeanDefinition对象 - beanDefinitionReader.loadBeanDefinitions(configLocation); - //初始化bean - finishBeanInitialization(); - } - - //bean的初始化 - private void finishBeanInitialization() throws Exception { - //获取注册表对象 - BeanDefinitionRegistry registry = beanDefinitionReader.getRegistry(); - - //获取BeanDefinition对象 - String[] beanNames = registry.getBeanDefinitionNames(); - for (String beanName : beanNames) { - //进行bean的初始化 - getBean(beanName); - } - } - -} diff --git a/src/main/java/com/fangpeng/spring/framework/context/support/ClassPathXmlApplicationContext.java b/src/main/java/com/fangpeng/spring/framework/context/support/ClassPathXmlApplicationContext.java deleted file mode 100644 index f6e25340..00000000 --- a/src/main/java/com/fangpeng/spring/framework/context/support/ClassPathXmlApplicationContext.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.fangpeng.spring.framework.context.support; - -import com.fangpeng.spring.framework.beans.BeanDefinition; -import com.fangpeng.spring.framework.beans.MutablePropertyValues; -import com.fangpeng.spring.framework.beans.PropertyValue; -import com.fangpeng.spring.framework.beans.factory.support.BeanDefinitionRegistry; -import com.fangpeng.spring.framework.beans.factory.xml.XmlBeanDefinitionReader; -import com.fangpeng.spring.framework.utils.StringUtils; - -import java.lang.reflect.Method; -import java.rmi.registry.Registry; - -/** - * @Description: IOC容器具体的子实现类 - * 用于加载类路径下的xml格式的配置文件 - * @Author : Lemon-CS - * @Date : 2022年02月10日 6:32 下午 - */ -public class ClassPathXmlApplicationContext extends AbstractApplicationContext { - - public ClassPathXmlApplicationContext(String configLocation) { - this.configLocation = configLocation; - //构建解析器对象 - beanDefinitionReader = new XmlBeanDefinitionReader(); - - try { - this.refresh(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - //根据bean对象的名称获取bean对象 - @Override - public Object getBean(String name) throws Exception { - //判断对象容器中是否包含指定名称的bean对象,如果包含,直接返回即可,如果不包含,需要自行创建 - Object obj = singletonMap.get(name); - if (obj != null) { - return obj; - } - - //获取BeanDefinition对象 - BeanDefinitionRegistry registry = beanDefinitionReader.getRegistry(); - BeanDefinition beanDefinition = registry.getBeanDefinition(name); - - //获取bean信息中的className - String className = beanDefinition.getClassName(); - - //通过反射创建对象 - Class clazz = Class.forName(className); - Object beanObj = clazz.newInstance(); - - //进行依赖注入操作 - MutablePropertyValues propertyValues = beanDefinition.getPropertyValues(); - for (PropertyValue propertyValue : propertyValues) { - //获取name属性值 - String propertyName = propertyValue.getName(); - //获取value属性 - String value = propertyValue.getValue(); - //获取ref属性 - String ref = propertyValue.getRef(); - - if (ref != null && !"".equals(ref)) { - //获取依赖的bean对象 - Object bean = getBean(ref); - //拼接方法名 - String methodName = StringUtils.getSetterMethodByFieldName(propertyName); - //获取所有的方法对象 - Method[] methods = clazz.getMethods(); - for (Method method : methods) { - if (method.getName().equals(methodName)) { - method.invoke(beanObj, bean); - } - } - } - - if (value != null && !"".equals(value)) { - //拼接方法名 - String methodName = StringUtils.getSetterMethodByFieldName(propertyName); - //获取method对象 - Method method = clazz.getMethod(methodName, String.class); - method.invoke(beanObj, value); - } - } - - //在返回beanObj对象之前,将该对象存储到map容器中 - singletonMap.put(name, beanObj); - - return beanObj; - } - - @Override - public T getBean(String name, Class clazz) throws Exception { - Object bean = getBean(name); - if(bean == null) { - return null; - } - return clazz.cast(bean); - } -} diff --git a/src/main/java/com/fangpeng/spring/framework/utils/StringUtils.java b/src/main/java/com/fangpeng/spring/framework/utils/StringUtils.java deleted file mode 100644 index 67b49665..00000000 --- a/src/main/java/com/fangpeng/spring/framework/utils/StringUtils.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fangpeng.spring.framework.utils; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年02月10日 6:44 下午 - */ -public class StringUtils { - - private StringUtils() { - - } - - // userDao ==> setUserDao - public static String getSetterMethodByFieldName(String fieldName) { - String methodName = "set" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1); - return methodName; - } - -} diff --git a/src/main/java/com/fangpeng/test/TestA.java b/src/main/java/com/fangpeng/test/TestA.java deleted file mode 100644 index ccd40b29..00000000 --- a/src/main/java/com/fangpeng/test/TestA.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fangpeng.test; - -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年02月11日 10:38 下午 - */ -public class TestA { - -} diff --git a/src/main/java/com/fangpeng/timejob/elasticjob/ArchivieJob.java b/src/main/java/com/fangpeng/timejob/elasticjob/ArchivieJob.java deleted file mode 100644 index 70146a5c..00000000 --- a/src/main/java/com/fangpeng/timejob/elasticjob/ArchivieJob.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.fangpeng.timejob.elasticjob; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月04日 12:07 上午 - */ - -import com.dangdang.ddframe.job.api.ShardingContext; -import com.dangdang.ddframe.job.api.simple.SimpleJob; - -import java.util.List; -import java.util.Map; - -/** - * ElasticJobLite定时任务业务逻辑处理类 - */ -public class ArchivieJob implements SimpleJob { - - /** - * 需求:resume表中未归档的数据归档到resume_bak表中,每次归档1条记录 - * execute方法中写我们的业务逻辑(execute方法每次定时任务执行都会执行一次) - * @param shardingContext - */ - @Override - public void execute(ShardingContext shardingContext) { - int shardingItem = shardingContext.getShardingItem(); - System.out.println("=====>>>>当前分片:" + shardingItem); - - // 获取分片参数 - String shardingParameter = shardingContext.getShardingParameter(); // 0=bachelor,1=master,2=doctor - - - // 1 从resume表中查询出1条记录(未归档) - String selectSql = "select * from resume where state='未归档' and education='"+ shardingParameter +"' limit 1"; - List> list = JdbcUtil.executeQuery(selectSql); - if(list == null || list.size() ==0 ) { - System.out.println("数据已经处理完毕!!!!!!"); - return; - } - // 2 "未归档"更改为"已归档" - Map stringObjectMap = list.get(0); - long id = (long) stringObjectMap.get("id"); - String name = (String) stringObjectMap.get("name"); - String education = (String) stringObjectMap.get("education"); - - System.out.println("=======>>>>id:" + id + " name:" + name + " education:" + education); - - String updateSql = "update resume set state='已归档' where id=?"; - JdbcUtil.executeUpdate(updateSql,id); - - // 3 归档这条记录,把这条记录插入到resume_bak表 - String insertSql = "insert into resume_bak select * from resume where id=?"; - JdbcUtil.executeUpdate(insertSql,id); - } -} diff --git a/src/main/java/com/fangpeng/timejob/elasticjob/DemoJob.java b/src/main/java/com/fangpeng/timejob/elasticjob/DemoJob.java deleted file mode 100644 index 5f50350e..00000000 --- a/src/main/java/com/fangpeng/timejob/elasticjob/DemoJob.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.fangpeng.timejob.elasticjob; - -import com.dangdang.ddframe.job.api.ShardingContext; -import com.dangdang.ddframe.job.api.simple.SimpleJob; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月04日 12:08 上午 - */ -public class DemoJob implements SimpleJob { - @Override - public void execute(ShardingContext shardingContext) { - System.out.println("elasticJob -----> 测试任务 "); - } -} diff --git a/src/main/java/com/fangpeng/timejob/elasticjob/ElasticJobMain.java b/src/main/java/com/fangpeng/timejob/elasticjob/ElasticJobMain.java deleted file mode 100644 index 662ac37a..00000000 --- a/src/main/java/com/fangpeng/timejob/elasticjob/ElasticJobMain.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.fangpeng.timejob.elasticjob; - -import com.dangdang.ddframe.job.config.JobCoreConfiguration; -import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration; -import com.dangdang.ddframe.job.lite.api.JobScheduler; -import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration; -import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter; -import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration; -import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月04日 12:08 上午 - */ -public class ElasticJobMain { - - public static void main(String[] args) { - // 配置分布式协调服务(注册中心)Zookeeper - ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration("localhost:2181", "test-elastic-job"); - CoordinatorRegistryCenter coordinatorRegistryCenter = new ZookeeperRegistryCenter(zookeeperConfiguration); - coordinatorRegistryCenter.init(); - - // 配置任务(时间事件、定时任务业务逻辑、调度器) - JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration - .newBuilder("demo-job", "*/2 * * * * ?", 3) - .shardingItemParameters("0=bachelor,1=master,2=doctor").build(); - SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(jobCoreConfiguration, DemoJob.class.getName()); - JobScheduler jobScheduler = new JobScheduler(coordinatorRegistryCenter, LiteJobConfiguration.newBuilder(simpleJobConfiguration).overwrite(true).build()); - jobScheduler.init(); - } - -} diff --git a/src/main/java/com/fangpeng/timejob/elasticjob/JdbcUtil.java b/src/main/java/com/fangpeng/timejob/elasticjob/JdbcUtil.java deleted file mode 100644 index ad124c16..00000000 --- a/src/main/java/com/fangpeng/timejob/elasticjob/JdbcUtil.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.fangpeng.timejob.elasticjob; - -import java.sql.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月04日 12:06 上午 - */ -public class JdbcUtil { - //url - private static String url = "jdbc:mysql://localhost:3306/job?characterEncoding=utf8&useSSL=false"; - //user - private static String user = "root"; - //password - private static String password = "123456"; - //驱动程序类 - private static String driver = "com.mysql.jdbc.Driver"; - - static { - try { - Class.forName(driver); - } catch (ClassNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - public static Connection getConnection() { - - try { - return DriverManager.getConnection(url, user, password); - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return null; - - } - - public static void close(ResultSet rs, PreparedStatement ps, Connection con) { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - if (ps != null) { - try { - ps.close(); - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - if (con != null) { - try { - con.close(); - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - } - } - } - } - - - /*** - * DML操作(增删改) - * 1.获取连接数据库对象 - * 2.预处理 - * 3.执行更新操作 - * @param sql - * @param obj - */ - //调用者只需传入一个sql语句,和一个Object数组。该数组存储的是SQL语句中的占位符 - public static void executeUpdate(String sql,Object...obj) { - Connection con = getConnection();//调用getConnection()方法连接数据库 - PreparedStatement ps = null; - try { - ps = con.prepareStatement(sql);//预处理 - for (int i = 0; i < obj.length; i++) {//预处理声明占位符 - ps.setObject(i + 1, obj[i]); - } - ps.executeUpdate();//执行更新操作 - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - close(null, ps, con);//调用close()方法关闭资源 - } - } - - - - /*** - * DQL查询 - * Result获取数据集 - * - * @param sql - * @param obj - * @return - */ - public static List> executeQuery(String sql, Object...obj) { - Connection con = getConnection(); - ResultSet rs = null; - PreparedStatement ps = null; - try { - ps = con.prepareStatement(sql); - for (int i = 0; i < obj.length; i++) { - ps.setObject(i + 1, obj[i]); - } - rs = ps.executeQuery(); - //new 一个空的list集合用来存放查询结果 - List> list = new ArrayList<>(); - //获取结果集的列数 - int count = rs.getMetaData().getColumnCount(); - //对结果集遍历每一条数据是一个Map集合,列是k,值是v - while (rs.next()) { - //一个空的map集合,用来存放每一行数据 - Map map = new HashMap(); - for (int i = 0; i < count; i++) { - Object ob = rs.getObject(i + 1);//获取值 - String key = rs.getMetaData().getColumnName(i + 1);//获取k即列名 - map.put(key, ob); - } - list.add(map); - } - return list; - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - - close(rs, ps, con); - } - - return null; - } -} diff --git a/src/main/java/com/fangpeng/timejob/quartz/DemoJob.java b/src/main/java/com/fangpeng/timejob/quartz/DemoJob.java deleted file mode 100644 index 6e443a62..00000000 --- a/src/main/java/com/fangpeng/timejob/quartz/DemoJob.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.fangpeng.timejob.quartz; - -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月03日 11:29 下午 - */ -public class DemoJob implements Job { - @Override - public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { - System.out.println("我是一个定时任务执行逻辑"); - } -} diff --git a/src/main/java/com/fangpeng/timejob/quartz/QuartzMan.java b/src/main/java/com/fangpeng/timejob/quartz/QuartzMan.java deleted file mode 100644 index ba9f23f0..00000000 --- a/src/main/java/com/fangpeng/timejob/quartz/QuartzMan.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.fangpeng.timejob.quartz; - -import org.quartz.*; -import org.quartz.impl.StdSchedulerFactory; - -/** - * @Description: TODO - * @Author : Lemon-CS - * @Date : 2022年03月03日 11:24 下午 - */ -public class QuartzMan { - - // 1、创建任务调度器(好比公交调度站) - public static Scheduler createScheduler() throws SchedulerException { - SchedulerFactory schedulerFactory = new StdSchedulerFactory(); - Scheduler scheduler = schedulerFactory.getScheduler(); - return scheduler; - } - - - // 2、创建一个任务(好比某一个公交车的出行) - public static JobDetail createJob() { - JobBuilder jobBuilder = JobBuilder.newJob(DemoJob.class); // 自定义任务类 - jobBuilder.withIdentity("jobName","myJob"); - JobDetail jobDetail = jobBuilder.build(); - return jobDetail; - } - - /** - * 3、创建作业任务时间触发器(类似于公交车出车时间表) - * cron表达式由七个位置组成,空格分隔 - * 1、Seconds(秒) 0~59 - * 2、Minutes(分) 0~59 - * 3、Hours(小时) 0~23 - * 4、Day of Month(天)1~31,注意有的月份不足31天 - * 5、Month(月) 0~11,或者 JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC - * 6、Day of Week(周) 1~7,1=SUN或者 SUN,MON,TUE,WEB,THU,FRI,SAT - * 7、Year(年)1970~2099 可选项 - *示例: - * 0 0 11 * * ? 每天的11点触发执行一次 - * 0 30 10 1 * ? 每月1号上午10点半触发执行一次 - */ - public static Trigger createTrigger() { - // 创建时间触发器 - CronTrigger cronTrigger = TriggerBuilder.newTrigger() - .withIdentity("triggerName","myTrigger") - .startNow() - .withSchedule(CronScheduleBuilder.cronSchedule("*/2 * * * * ?")).build(); - return cronTrigger; - } - - /** - * main函数中开启定时任务 - * @param args - */ - public static void main(String[] args) throws SchedulerException { - // 1、创建任务调度器(好比公交调度站) - Scheduler scheduler = QuartzMan.createScheduler(); - // 2、创建一个任务(好比某一个公交车的出行) - JobDetail job = QuartzMan.createJob(); - // 3、创建任务的时间触发器(好比这个公交车的出行时间表) - Trigger trigger = QuartzMan.createTrigger(); - - // 4、使用任务调度器根据时间触发器执行我们的任务 - scheduler.scheduleJob(job, trigger); - scheduler.start(); - } - -} diff --git a/src/main/java/server/Bootstrap.java b/src/main/java/server/Bootstrap.java new file mode 100644 index 00000000..37a96439 --- /dev/null +++ b/src/main/java/server/Bootstrap.java @@ -0,0 +1,181 @@ +package server; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.*; + +/** + * @Description: Minicat的主类 + * @Author : Lemon-CS + * @Date : 2022年02月27日 10:36 下午 + */ +public class Bootstrap { + + /**定义socket监听的端口号*/ + private int port = 8080; + + private Map servletMap = new HashMap(); + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + /** + * Minicat启动需要初始化展开的一些操作 + */ + public void start() throws Exception { + + // 加载解析相关的配置,web.xml + loadServlet(); + + // 定义一个线程池 + int corePoolSize = 10; + int maximumPoolSize =50; + long keepAliveTime = 100L; + TimeUnit unit = TimeUnit.SECONDS; + BlockingQueue workQueue = new ArrayBlockingQueue<>(50); + ThreadFactory threadFactory = Executors.defaultThreadFactory(); + RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); + + + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( + corePoolSize, + maximumPoolSize, + keepAliveTime, + unit, + workQueue, + threadFactory, + handler + ); + + /* + 完成Minicat 1.0版本 + 需求:浏览器请求http://localhost:8080,返回一个固定的字符串到页面"Hello Minicat!" + */ + /*ServerSocket serverSocket = new ServerSocket(port); + System.out.println("=====>>>Minicat start on port:" + port); + + while (true) { + Socket socket = serverSocket.accept(); + + // 有了socket,接收到请求,获取输出流 + OutputStream outputStream = socket.getOutputStream(); + String data = "Hello Minicat!"; + String responseText = HttpProtocolUtil.getHttpHeader200(data.getBytes(StandardCharsets.UTF_8).length) + data; + outputStream.write(responseText.getBytes(StandardCharsets.UTF_8)); + socket.close(); + }*/ + + /** + * 完成Minicat 2.0版本 + * 需求:封装Request和Response对象,返回html静态资源文件 + */ + /*ServerSocket serverSocket = new ServerSocket(port); + System.out.println("=====>>>Minicat start on port:" + port); + + while (true) { + Socket socket = serverSocket.accept(); + InputStream inputStream = socket.getInputStream(); + OutputStream outputStream = socket.getOutputStream(); + + // 封装Request对象和Response对象 + Request request = new Request(inputStream); + Response response = new Response(outputStream); + + response.outputHtml(request.getUrl()); + socket.close(); + }*/ + + /** + * 完成Minicat 3.0版本 + * 需求:可以请求动态资源(Servlet) + */ + ServerSocket serverSocket = new ServerSocket(port); + System.out.println("=====>>>Minicat start on port:" + port); + + while (true) { + + Socket socket = serverSocket.accept(); + RequestProcessor requestProcessor = new RequestProcessor(socket,servletMap); + //requestProcessor.start(); + threadPoolExecutor.execute(requestProcessor); + + } + + } + + /** + * 加载解析web.xml,初始化Servlet + */ + private void loadServlet() { + InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("web.xml"); + SAXReader saxReader = new SAXReader(); + + try { + Document document = saxReader.read(resourceAsStream); + Element rootElement = document.getRootElement(); + + List selectNodes = rootElement.selectNodes("//servlet"); + + for (int i = 0; i < selectNodes.size(); i++) { + + Element element = selectNodes.get(i); + + // lagou + Element servletnameElement = (Element) element.selectSingleNode("servlet-name"); + String servletName = servletnameElement.getStringValue(); + // server.LagouServlet + Element servletclassElement = (Element) element.selectSingleNode("servlet-class"); + String servletClass = servletclassElement.getStringValue(); + + + // 根据servlet-name的值找到url-pattern + Element servletMapping = (Element) rootElement.selectSingleNode("/web-app/servlet-mapping[servlet-name='" + servletName + "']"); + // /lagou + String urlPattern = servletMapping.selectSingleNode("url-pattern").getStringValue(); + servletMap.put(urlPattern, (HttpServlet) Class.forName(servletClass).newInstance()); + + } + + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + + /** + * Minicat 的程序启动入口 + * @param args + */ + public static void main(String[] args) { + Bootstrap bootstrap = new Bootstrap(); + try { + // 启动Minicat + bootstrap.start(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/server/HttpProtocolUtil.java b/src/main/java/server/HttpProtocolUtil.java new file mode 100644 index 00000000..256d59d6 --- /dev/null +++ b/src/main/java/server/HttpProtocolUtil.java @@ -0,0 +1,33 @@ +package server; + +/** + * @Description: http协议工具类,主要是提供响应头信息,这里我们只提供200和404的情况 + * @Author : Lemon-CS + * @Date : 2022年02月27日 10:46 下午 + */ +public class HttpProtocolUtil { + + /** + * 为响应码200提供请求头信息 + * @return + */ + public static String getHttpHeader200(long contentLength) { + return "HTTP/1.1 200 OK \n" + + "Content-Type: text/html \n" + + "Content-Length: " + contentLength + " \n" + + "\r\n"; + } + + /** + * 为响应码404提供请求头信息(此处也包含了数据内容) + * @return + */ + public static String getHttpHeader404() { + String str404 = "

404 not found

"; + return "HTTP/1.1 404 NOT Found \n" + + "Content-Type: text/html \n" + + "Content-Length: " + str404.getBytes().length + " \n" + + "\r\n" + str404; + } + +} diff --git a/src/main/java/server/HttpServlet.java b/src/main/java/server/HttpServlet.java new file mode 100644 index 00000000..409f36df --- /dev/null +++ b/src/main/java/server/HttpServlet.java @@ -0,0 +1,22 @@ +package server; + +/** + * @Description: TODO + * @Author : Lemon-CS + * @Date : 2022年02月27日 11:48 下午 + */ +public abstract class HttpServlet implements Servlet { + + public abstract void doGet(Request request, Response response); + + public abstract void doPost(Request request, Response response); + + @Override + public void service(Request request, Response response) throws Exception { + if("GET".equalsIgnoreCase(request.getMethod())) { + doGet(request, response); + }else{ + doPost(request, response); + } + } +} diff --git a/src/main/java/server/LemonServlet.java b/src/main/java/server/LemonServlet.java new file mode 100644 index 00000000..acc6bba0 --- /dev/null +++ b/src/main/java/server/LemonServlet.java @@ -0,0 +1,55 @@ +package server; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +/** + * @Description: TODO + * @Author : Lemon-CS + * @Date : 2022年02月27日 11:51 下午 + */ +public class LemonServlet extends HttpServlet { + + @Override + public void doGet(Request request, Response response) { + + try { + Thread.sleep(100000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + String content = "

LemonServlet get

"; + try { + response.output(HttpProtocolUtil.getHttpHeader200( + content.getBytes(StandardCharsets.UTF_8).length) + + content); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void doPost(Request request, Response response) { + String content = "

LemonServlet post

"; + + try { + response.output(HttpProtocolUtil.getHttpHeader200( + content.getBytes(StandardCharsets.UTF_8).length) + + content); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + @Override + public void init() throws Exception { + + } + + @Override + public void destory() throws Exception { + + } +} diff --git a/src/main/java/server/Request.java b/src/main/java/server/Request.java new file mode 100644 index 00000000..519f927e --- /dev/null +++ b/src/main/java/server/Request.java @@ -0,0 +1,72 @@ +package server; + +import java.io.InputStream; + +/** + * @Description: 把请求信息封装为Request对象(根据InputSteam输入流封装) + * @Author : Lemon-CS + * @Date : 2022年02月27日 11:09 下午 + */ +public class Request { + + private String method; // 请求方式,比如GET/POST + private String url; // 例如 /,/index.html + + private InputStream inputStream; // 输入流,其他属性从输入流中解析出来 + + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public InputStream getInputStream() { + return inputStream; + } + + public void setInputStream(InputStream inputStream) { + this.inputStream = inputStream; + } + + public Request() { + } + + // 构造器,输入流传入 + public Request(InputStream inputStream) throws Exception { + this.inputStream = inputStream; + + // 从输入流中获取请求信息 + int count = 0; + while (count == 0) { + count = inputStream.available(); + } + + byte[] bytes = new byte[count]; + inputStream.read(bytes); + + String inputStr = new String(bytes); + // 获取第一行请求头信息 + String firstLineStr = inputStr.split("\\n")[0]; // GET / HTTP/1.1 + + String[] strings = firstLineStr.split(" "); + + this.method = strings[0]; + this.url = strings[1]; + + System.out.println("=====>>>request method: " + method); + System.out.println("=====>>>request url: " + url); + + } + +} diff --git a/src/main/java/server/RequestProcessor.java b/src/main/java/server/RequestProcessor.java new file mode 100644 index 00000000..279c1d96 --- /dev/null +++ b/src/main/java/server/RequestProcessor.java @@ -0,0 +1,46 @@ +package server; + +import java.io.InputStream; +import java.net.Socket; +import java.util.Map; + +/** + * @Description: 请求处理类 + * @Author : Lemon-CS + * @Date : 2022年02月28日 10:06 下午 + */ +public class RequestProcessor extends Thread { + private Socket socket; + private Map servletMap; + + public RequestProcessor(Socket socket, Map servletMap) { + this.socket = socket; + this.servletMap = servletMap; + } + + @Override + public void run() { + try{ + InputStream inputStream = socket.getInputStream(); + + // 封装Request对象和Response对象 + Request request = new Request(inputStream); + Response response = new Response(socket.getOutputStream()); + + // 静态资源处理 + if(servletMap.get(request.getUrl()) == null) { + response.outputHtml(request.getUrl()); + }else{ + // 动态资源servlet请求 + HttpServlet httpServlet = servletMap.get(request.getUrl()); + httpServlet.service(request,response); + } + + socket.close(); + + }catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/src/main/java/server/Response.java b/src/main/java/server/Response.java new file mode 100644 index 00000000..cea781a4 --- /dev/null +++ b/src/main/java/server/Response.java @@ -0,0 +1,55 @@ +package server; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; + +/** + * @Description: 封装Response对象,需要依赖于OutputStream + * 该对象需要提供核心方法,输出html + * @Author : Lemon-CS + * @Date : 2022年02月27日 11:11 下午 + */ +public class Response { + + private OutputStream outputStream; + + public Response() { + } + + public Response(OutputStream outputStream) { + this.outputStream = outputStream; + } + + // 使用输出流输出指定字符串 + public void output(String content) throws IOException { + outputStream.write(content.getBytes()); + } + + /** + * + * @param path url,随后要根据url来获取到静态资源的绝对路径,进一步根据绝对路径读取该静态资源文件,最终通过 + * 输出流输出 + * /-----> classes + */ + public void outputHtml(String path) throws IOException { + // 获取静态资源文件的绝对路径 + String absoluteResourcePath = StaticResourceUtil.getAbsolutePath(path); + + // 输入静态资源文件 + File file = new File(absoluteResourcePath); + + if (file.exists() && file.isFile()) { + // 读取静态资源文件,输出静态资源 + StaticResourceUtil.outputStaticResource(new FileInputStream(file), outputStream); + } else { + // 输出404 + output(HttpProtocolUtil.getHttpHeader404()); + } + + + } + +} diff --git a/src/main/java/server/Servlet.java b/src/main/java/server/Servlet.java new file mode 100644 index 00000000..db9c1d17 --- /dev/null +++ b/src/main/java/server/Servlet.java @@ -0,0 +1,16 @@ +package server; + +/** + * @Description: Servlet接口 + * @Author : Lemon-CS + * @Date : 2022年02月27日 11:48 下午 + */ +public interface Servlet { + + void init() throws Exception; + + void destory() throws Exception; + + void service(Request request,Response response) throws Exception; + +} diff --git a/src/main/java/server/StaticResourceUtil.java b/src/main/java/server/StaticResourceUtil.java new file mode 100644 index 00000000..9f123203 --- /dev/null +++ b/src/main/java/server/StaticResourceUtil.java @@ -0,0 +1,60 @@ +package server; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; + +/** + * @Description: 静态资源工具类 + * @Author : Lemon-CS + * @Date : 2022年02月27日 11:23 下午 + */ +public class StaticResourceUtil { + + /** + * 获取静态资源文件的绝对路径 + * @param path + * @return + */ + public static String getAbsolutePath(String path) { + String absolutePath = StaticResourceUtil.class.getResource("/").getPath(); + return absolutePath.replaceAll("\\\\","/") + path; + } + + /** + * 读取静态资源文件输入流,通过输出流输出 + */ + public static void outputStaticResource(InputStream inputStream, OutputStream outputStream) throws IOException { + + int count = 0; + while (count == 0) { + count = inputStream.available(); + } + + int resourceSize = count; + + // 输出http请求头,然后再输出具体内容 + outputStream.write(HttpProtocolUtil.getHttpHeader200(resourceSize).getBytes(StandardCharsets.UTF_8)); + + // 读取内容输出 + long written = 0 ;// 已经读取的内容长度 + int byteSize = 1024; // 计划每次缓冲的长度 + byte[] bytes = new byte[byteSize]; + + while (written < resourceSize) { + if(written + byteSize > resourceSize) { // 说明剩余未读取大小不足一个1024长度,那就按真实长度处理 + byteSize = (int) (resourceSize - written); // 剩余的文件内容长度 + bytes = new byte[byteSize]; + } + + inputStream.read(bytes); + outputStream.write(bytes); + + outputStream.flush(); + + written += byteSize; + } + } + + } diff --git a/src/main/resources/bean.properties b/src/main/resources/bean.properties deleted file mode 100644 index 092aa6df..00000000 --- a/src/main/resources/bean.properties +++ /dev/null @@ -1,2 +0,0 @@ -american=com.fangpeng.design.pattern.factory.config_factory.AmericanCoffee -latte=com.fangpeng.design.pattern.factory.config_factory.LatteCoffee \ No newline at end of file diff --git a/src/main/resources/images/bio-chatroom-sequence-diagram.png b/src/main/resources/images/bio-chatroom-sequence-diagram.png deleted file mode 100644 index 48c08dfc..00000000 Binary files a/src/main/resources/images/bio-chatroom-sequence-diagram.png and /dev/null differ diff --git a/src/main/resources/index.html b/src/main/resources/index.html new file mode 100644 index 00000000..c7b9c302 --- /dev/null +++ b/src/main/resources/index.html @@ -0,0 +1,10 @@ + + + + + static resouce + + +Hello Minicat-static resouce! + + \ No newline at end of file diff --git a/src/main/resources/web.xml b/src/main/resources/web.xml new file mode 100644 index 00000000..2b98c12c --- /dev/null +++ b/src/main/resources/web.xml @@ -0,0 +1,13 @@ + + + + lemon + server.LemonServlet + + + + + lemon + /lemon + + diff --git a/src/test/java/com/fangpeng/netty/chat/TestMessageCodec.java b/src/test/java/com/fangpeng/netty/chat/TestMessageCodec.java deleted file mode 100644 index 5be4d855..00000000 --- a/src/test/java/com/fangpeng/netty/chat/TestMessageCodec.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.fangpeng.netty.chat; - -import com.fangpeng.netty.chat.message.LoginRequestMessage; -import com.fangpeng.netty.chat.protocol.MessageCodec; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.channel.embedded.EmbeddedChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.logging.LoggingHandler; - -/** - * @author 方鹏 - * @date 2022年01月26日 5:36 下午 - */ -public class TestMessageCodec { - - public static void main(String[] args) throws Exception { - EmbeddedChannel channel = new EmbeddedChannel( - new LoggingHandler(), - new LengthFieldBasedFrameDecoder( - 1024, 12, 4, 0, 0), - new MessageCodec() - ); - // encode - LoginRequestMessage message = new LoginRequestMessage("zhangsan", "123", "张三"); -// channel.writeOutbound(message); - // decode - ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(); - new MessageCodec().encode(null, message, buf); - - ByteBuf s1 = buf.slice(0, 100); - ByteBuf s2 = buf.slice(100, buf.readableBytes() - 100); - s1.retain(); // 引用计数 2 - channel.writeInbound(s1); // release 1 - channel.writeInbound(s2); - } - -} diff --git a/target/classes/bean.properties b/target/classes/bean.properties deleted file mode 100644 index 092aa6df..00000000 --- a/target/classes/bean.properties +++ /dev/null @@ -1,2 +0,0 @@ -american=com.fangpeng.design.pattern.factory.config_factory.AmericanCoffee -latte=com.fangpeng.design.pattern.factory.config_factory.LatteCoffee \ No newline at end of file diff --git a/target/classes/images/bio-chatroom-sequence-diagram.png b/target/classes/images/bio-chatroom-sequence-diagram.png deleted file mode 100644 index 48c08dfc..00000000 Binary files a/target/classes/images/bio-chatroom-sequence-diagram.png and /dev/null differ diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties deleted file mode 100644 index 7151291e..00000000 --- a/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Thu Jan 20 22:58:41 CST 2022 -version=1.0-SNAPSHOT -groupId=com.fangpeng -artifactId=study diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index a2a288a0..00000000 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1 +0,0 @@ -com/fangpeng/io/nio/demo/NIOServer.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index c8c0d9d4..00000000 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,22 +0,0 @@ -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/aio/chatroom/client/ChatClient.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/demo/IOClient.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/aio/chatroom/server/ChatServer.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/nio/file/FileCopyDemo.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/UserInputHandler.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/aio/demo/Server.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/chatroom/client/UserInputHandler.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/aio/chatroom/client/UserInputHandler.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/aio/demo/Client.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/demo/Client.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/nio/chatroom/server/ChatServer.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/client/ChatClient.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/nio/chatroom/client/ChatClient.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatServer.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/threadpool/chatroom/server/ChatHandler.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/chatroom/client/ChatClient.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/nio/chatroom/client/UserInputHandler.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/demo/IOServer.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatHandler.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/nio/demo/NIOServer.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/bio/chatroom/server/ChatServer.java -/Users/fangpeng/IDEAProjects/study/src/main/java/com/fangpeng/io/demo/Server.java diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29b..00000000