diff --git a/README.md b/README.md
index 3348ebd0a73787c4e19f3e39bcfbace10213fdd6..d3c86a170bf8749ced4595e46f0ddfebbcf2ea81 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+[](https://gitee.com/blackshao/springbootlearn)
# springbootlearn
#### Schedule
**module:2019-1-23**
@@ -55,4 +56,5 @@ springbootlearn 一起学习springboot,
4. 代码提交,分支合并请先meger到 develop分支.后续测试,接收才并到master发布.
-#### 会员风采的栏目
+#### 会员风采的栏目
+[](https://gitee.com/blackshao/springbootlearn)
\ No newline at end of file
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_1/CompositeDemo1Test.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_1/CompositeDemo1Test.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb5caf8a4fcb92ae0763056cea35966b853bf3ff
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_1/CompositeDemo1Test.java
@@ -0,0 +1,60 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.composite.demo_1;
+
+import java.math.BigDecimal;
+
+public class CompositeDemo1Test {
+
+ public static void main(String[] args) {
+ //CEO
+ Employee CEO = new Employee("John", "CEO", new BigDecimal(30000));
+
+ //销售主管
+ Employee headSales = new Employee("Robert", "Head Sales", new BigDecimal(20000));
+
+ //市场营销
+ Employee headMarketing = new Employee("Michel", "Head Marketing", new BigDecimal(20000));
+
+ //营业员_1
+ Employee clerk_1 = new Employee("Laura", "Marketing", new BigDecimal(10000));
+
+ //营业员_2
+ Employee clerk_2 = new Employee("Bob", "Marketing", new BigDecimal(10000));
+
+ //销售主管_1
+ Employee salesExecutive_1 = new Employee("Richard", "Sales", new BigDecimal(10000));
+
+ //销售主管_2
+ Employee salesExecutive_2 = new Employee("Rob", "Sales", new BigDecimal(10000));
+
+ CEO.add(headSales);
+ CEO.add(headMarketing);
+
+ headSales.add(salesExecutive_1);
+ headSales.add(salesExecutive_2);
+
+ headMarketing.add(clerk_1);
+ headMarketing.add(clerk_2);
+
+ //打印该组织所有员工
+ System.out.println(CEO);
+
+ //迭代
+ printSub(CEO);
+ /*for (Employee headEmployee : CEO.getSubordinates()) {
+ System.out.println(headEmployee);
+ for (Employee employee : headEmployee.getSubordinates()) {
+ System.out.println(employee);
+ }
+ }*/
+
+ }
+
+ private static void printSub(Employee root) {
+ for (Employee employee : root.getSubordinates()) {
+ System.out.println(employee);
+ if (!employee.getSubordinates().isEmpty()) {
+ printSub(employee);
+ }
+ }
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_1/Employee.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_1/Employee.java
new file mode 100644
index 0000000000000000000000000000000000000000..5a4753429e2204d20fb2b3e323ce3e07207bdbb8
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_1/Employee.java
@@ -0,0 +1,51 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.composite.demo_1;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description: 组合模型类
+ * 该类带有 Employee对象的列表
+ * @author Lingwenjun
+ * @date 2019/1/28-11:10
+ * @version 1.0
+ */
+public class Employee {
+ private String empName;
+
+ private String empDept;
+
+ private BigDecimal salary;
+
+ private List subordinates;
+
+ //construct
+ public Employee(String empName, String empDept, BigDecimal salary) {
+ this.empName = empName;
+ this.empDept = empDept;
+ this.salary = salary;
+ this.subordinates = new ArrayList<>();
+ }
+
+ public void add(Employee employee) {
+ subordinates.add(employee);
+ }
+
+ public void remove(Employee employee) {
+ subordinates.remove(employee);
+ }
+
+ public List getSubordinates() {
+ return subordinates;
+ }
+
+ @Override
+ public String toString() {
+ return "Employee{" +
+ "empName='" + empName + '\'' +
+ ", empDept='" + empDept + '\'' +
+ ", salary=" + salary +
+ '}';
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_2/Company.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_2/Company.java
new file mode 100644
index 0000000000000000000000000000000000000000..17eb381234513368c8c764514ff9b6c4d450d44e
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_2/Company.java
@@ -0,0 +1,25 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.composite.demo_2;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description: 公司的抽象类, 也可以写成接口
+ * @author Lingwenjun
+ * @date 2019/1/28-16:00
+ * @version 1.0
+ */
+public abstract class Company {
+
+ String name;
+ String sex;
+ String position;
+ BigDecimal salary;
+
+ //
+ List list = new ArrayList<>();
+
+ //获取信息
+ public abstract String getInfo();
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_2/CompositeDemo2Test.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_2/CompositeDemo2Test.java
new file mode 100644
index 0000000000000000000000000000000000000000..054b5353dbbd4f8b31db0de7b110d5fbfeaea836
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_2/CompositeDemo2Test.java
@@ -0,0 +1,59 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.composite.demo_2;
+
+import java.math.BigDecimal;
+
+public class CompositeDemo2Test {
+
+ public static void main(String[] args) {
+ //CEO
+ ConcreateCompany ceo = new ConcreateCompany("liangwj", "male", "ceo", new BigDecimal(20000));
+
+ //三个经理
+ ConcreateCompany developDept = new ConcreateCompany("阿萨德", "男", "技术主管", new BigDecimal(15000));
+ ConcreateCompany salesDept = new ConcreateCompany("理查德", "男", "销售主管", new BigDecimal(10000));
+ ConcreateCompany finaceDept = new ConcreateCompany("玛丽", "女", "财务主管", new BigDecimal(15000));
+ ceo.add(developDept);
+ ceo.add(salesDept);
+ ceo.add(finaceDept);
+
+ //部门员工
+ Employee emp0 = new Employee("A", "男", "技术部", new BigDecimal(12000));
+ Employee emp1 = new Employee("B", "女", "技术部", new BigDecimal(11000));
+ Employee emp2 = new Employee("C", "男", "技术部", new BigDecimal(10000));
+ developDept.add(emp0);
+ developDept.add(emp1);
+ developDept.add(emp2);
+
+ Employee emp3 = new Employee("D", "女", "销售部", new BigDecimal(7000));
+ Employee emp4 = new Employee("E", "女", "销售部", new BigDecimal(8000));
+ Employee emp5 = new Employee("F", "男", "销售部", new BigDecimal(6000));
+ salesDept.add(emp3);
+ salesDept.add(emp4);
+ salesDept.add(emp5);
+
+ Employee emp6 = new Employee("G", "男", "财务部", new BigDecimal(12000));
+ Employee emp7 = new Employee("H", "男", "财务部", new BigDecimal(8000));
+ Employee emp8 = new Employee("I", "女", "财务部", new BigDecimal(8000));
+ finaceDept.add(emp6);
+ finaceDept.add(emp7);
+ finaceDept.add(emp8);
+
+ //打印公司人员架构
+ System.out.println(ceo.getInfo());
+ //多层级节点输出 需要迭代
+ display(ceo);
+
+
+ }
+
+ private static void display(ConcreateCompany node) {
+ for (Company company : node.getChild()) {
+ if (company instanceof Employee) { //节点类型是叶子节点(就是没有下一级节点了)
+ System.out.println(company.getInfo());
+ } else { //树枝节点
+ System.out.println("\n" + company.getInfo());
+ display((ConcreateCompany) company);
+ }
+ }
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_2/ConcreateCompany.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_2/ConcreateCompany.java
new file mode 100644
index 0000000000000000000000000000000000000000..83aba87f96e0ae9599d94221781201656a668973
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_2/ConcreateCompany.java
@@ -0,0 +1,60 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.composite.demo_2;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Description: 树枝构建: 树节点类, 可以对分支节点进行增删改查操作
+ * @author Lingwenjun
+ * @date 2019/1/28-16:04
+ * @version 1.0
+ */
+public class ConcreateCompany extends Company{
+
+ //
+ public ConcreateCompany(String name, String sex, String position, BigDecimal salary) {
+ this.name = name;
+ this.sex = sex;
+ this.position = position;
+ this.salary = salary;
+ }
+
+ /**
+ * 增加: 添加应给枝节点 company 为实例化的的子类
+ * @param company
+ */
+ public void add(Company company) {
+ list.add(company);
+ }
+
+ /**
+ * 删除子节点
+ * @param company
+ */
+ public void remove(Company company) {
+ list.remove(company);
+ }
+
+ /**
+ * 返回所有子节点
+ * @return
+ */
+ public List getChild() {
+ return list;
+ }
+
+ @Override
+ public String getInfo() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("领导 : ");
+ sb.append("名称:");
+ sb.append(name);
+ sb.append(", 性别:");
+ sb.append(sex);
+ sb.append(", 职位:");
+ sb.append(position);
+ sb.append(", 薪水:");
+ sb.append(salary);
+ return sb.toString();
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_2/Employee.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_2/Employee.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ab2d3c8d7a68c01849cfe856caafc1ef88a6c1a
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/demo_2/Employee.java
@@ -0,0 +1,36 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.composite.demo_2;
+
+import java.math.BigDecimal;
+
+/**
+ * Description: 叶子节点类:被上级的树枝节点管理
+ * 这里叶子节点没有什么权力,只能创建自己和看看自己的信息
+ * @author Lingwenjun
+ * @date 2019/1/28-16:15
+ * @version 1.0
+ */
+public class Employee extends Company{
+
+ public Employee(String name, String sex, String position, BigDecimal salary) {
+ this.name = name;
+ this.sex = sex;
+ this.position = position;
+ this.salary = salary;
+ }
+
+ //叶子节点本身的属性
+ @Override
+ public String getInfo() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("下属 : ");
+ sb.append("名称:");
+ sb.append(name);
+ sb.append(", 性别:");
+ sb.append(sex);
+ sb.append(", 职位:");
+ sb.append(position);
+ sb.append(", 薪水:");
+ sb.append(salary);
+ return sb.toString();
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/package-info.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..61ce172c0c755104b7980131bb92e7c64cfca629
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/composite/package-info.java
@@ -0,0 +1,21 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.composite;
+/**
+ * Description: 组合模式, 又叫部分整体模式
+ * 是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
+ * 这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
+ * 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
+ * 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。
+ *
+ *
+ 1.抽象组件(Component)角色
+ 该角色定义参加组合的对象的共有方法和属性,规范一些默认的行为接口。
+
+ 2.叶子构件(Leaf)角色
+ 该角色是叶子对象,其下没有其他的分支,定义出参加组合的原始对象的行为。
+
+ 3.树枝构件(Composite)角色
+ 该角色代表参加组合的、其下有分支的树枝对象,它的作用是将树枝和叶子组合成一个树形结构,并定义出管理子对象的方法,如add()、remove()等等。
+ * @author Lingwenjun
+ * @date 2019/1/28-11:09
+ * @version 1.0
+ */
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/Circle.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/Circle.java
new file mode 100644
index 0000000000000000000000000000000000000000..1e7fe00efeb33bb1da31076208b495a97d19854b
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/Circle.java
@@ -0,0 +1,13 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_1;
+/**
+ * Description: 实现了Shape的实体类: 圆形
+ * @author Lingwenjun
+ * @date 2019/1/29-10:54
+ * @version 1.0
+ */
+public class Circle implements Shape{
+ @Override
+ public void draw() {
+ System.out.println("Shape : Circle");
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/DecoratorDemo1Test.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/DecoratorDemo1Test.java
new file mode 100644
index 0000000000000000000000000000000000000000..96352c1e1b16e780b19422486fe1f67bd5b8ade4
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/DecoratorDemo1Test.java
@@ -0,0 +1,20 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_1;
+
+public class DecoratorDemo1Test {
+ public static void main(String[] args) {
+ Shape circle = new Circle();
+
+ Shape redCircle = new RedShapeDecorator(new Circle());
+
+ Shape redRectangle = new RedShapeDecorator(new Rectangle());
+
+ System.out.println("Circle with normal border");
+ circle.draw();
+
+ System.out.println("\n Circle with red border");
+ redCircle.draw();
+
+ System.out.println("\n Rectangle of red border");
+ redRectangle.draw();
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/Rectangle.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/Rectangle.java
new file mode 100644
index 0000000000000000000000000000000000000000..99621aa93d1e4e7e613f7c240df992745857d0d2
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/Rectangle.java
@@ -0,0 +1,13 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_1;
+/**
+ * Description: 实现类 Shape :Rectangle长方形
+ * @author Lingwenjun
+ * @date 2019/1/29-10:53
+ * @version 1.0
+ */
+public class Rectangle implements Shape {
+ @Override
+ public void draw() {
+ System.out.println("Shape : Rectangle");
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/RedShapeDecorator.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/RedShapeDecorator.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a638ffb3672c5f951645da1cbf2a33e60bff313
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/RedShapeDecorator.java
@@ -0,0 +1,23 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_1;
+/**
+ * Description: 实现了 ShapeDecorator类的实体装饰类
+ * @author Lingwenjun
+ * @date 2019/1/29-11:05
+ * @version 1.0
+ */
+public class RedShapeDecorator extends ShapeDecorator {
+
+ public RedShapeDecorator(Shape decoratorShape) {
+ super(decoratorShape);
+ }
+
+ @Override
+ public void draw() {
+ decoratorShape.draw();
+ setRedBorder(decoratorShape);
+ }
+
+ public void setRedBorder(Shape decoratorShape) {
+ System.out.println("Border Color : red");
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/Shape.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/Shape.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac6acdd68afc004f89502b893e55624dc140e259
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/Shape.java
@@ -0,0 +1,11 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_1;
+/**
+ * Description: Component类.抽象角色:形状
+ * @author Lingwenjun
+ * @date 2019/1/29-10:52
+ * @version 1.0
+ */
+public interface Shape {
+
+ void draw();
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/ShapeDecorator.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/ShapeDecorator.java
new file mode 100644
index 0000000000000000000000000000000000000000..ecb6a35153a5c655eec64a57e67b8a2e631105e7
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_1/ShapeDecorator.java
@@ -0,0 +1,21 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_1;
+/**
+ * Description: Shape 接口的抽象装饰类
+ * @author Lingwenjun
+ * @date 2019/1/29-10:55
+ * @version 1.0
+ */
+public abstract class ShapeDecorator implements Shape{
+
+ protected Shape decoratorShape;
+
+ //construct
+ public ShapeDecorator(Shape decoratorShape) {
+ this.decoratorShape = decoratorShape;
+ }
+
+ @Override
+ public void draw() {
+ decoratorShape.draw();
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/Beverage.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/Beverage.java
new file mode 100644
index 0000000000000000000000000000000000000000..5828c505a89a65fc0f81e5b900a9689e33a3ba52
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/Beverage.java
@@ -0,0 +1,22 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_2;
+/**
+ * Description: 饮料-- Component抽象实体类
+ * Q: 为什么不是接口?
+ * A:当初我们从星巴兹拿到这个程序时,Beverage已经是一个抽象类。
+ * 通常装饰者模式是采用抽象类,但是在java中可以使用接口,通常都努力避免修改现有的代码,
+ * 所以,如果抽象类运作得好好的,还是别去修改它。
+ *
+ * @author Lingwenjun
+ * @date 2019/1/29-14:59
+ * @version 1.0
+ */
+public abstract class Beverage {
+
+ String description = "Unknown Beverage";
+
+ public String getDescription() {
+ return description;
+ }
+
+ public abstract double cost();
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/CondimentDecorator.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/CondimentDecorator.java
new file mode 100644
index 0000000000000000000000000000000000000000..afcaacb8f3b6796bfc94f5fb133787d6b5aa5ba2
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/CondimentDecorator.java
@@ -0,0 +1,14 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_2;
+/**
+ * Description: 调料 抽象类 也就是装饰类
+ * 首先必须让 CondimentDecorator 能取代 Beverage , 所以讲 CondimentDecorator 扩展自 Beverage
+ * @author Lingwenjun
+ * @date 2019/1/29-15:03
+ * @version 1.0
+ */
+public abstract class CondimentDecorator extends Beverage{
+
+ //所有的调料装饰者都必须重新实现getDescription方法
+ @Override
+ public abstract String getDescription();
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/DecoratorDemo2Test.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/DecoratorDemo2Test.java
new file mode 100644
index 0000000000000000000000000000000000000000..265d6bd7ff23052d33c86e6a1c8bd1fcb47b3516
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/DecoratorDemo2Test.java
@@ -0,0 +1,13 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_2;
+
+public class DecoratorDemo2Test {
+ public static void main(String[] args) {
+
+ Beverage beverage = new HouseBlend();
+ beverage = new Mocha(beverage);
+ beverage = new Whip(beverage);
+
+ System.out.println("description : " + beverage.getDescription());
+ System.out.println("cost : " + beverage.cost());
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/Espresso.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/Espresso.java
new file mode 100644
index 0000000000000000000000000000000000000000..752d92b390a201603d27a23d1199af97cda365fe
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/Espresso.java
@@ -0,0 +1,62 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_2;
+/**
+ * Description: 浓缩咖啡
+ * @author Lingwenjun
+ * @date 2019/1/29-15:08
+ * @version 1.0
+ */
+public class Espresso extends Beverage{
+
+ //为了要设置饮料的描述,我们写了一个构造器,description实例变量继承自Beverage
+ public Espresso() {
+ description = "Espresso";
+ }
+
+ //计算价格
+ @Override
+ public double cost() {
+ return 1.99;
+ }
+}
+
+class HouseBlend extends Beverage{
+
+ //为了要设置饮料的描述,我们写了一个构造器,description实例变量继承自Beverage
+ public HouseBlend() {
+ description = "HouseBlend";
+ }
+
+ //计算价格
+ @Override
+ public double cost() {
+ return 0.89;
+ }
+}
+
+class DarkRoast extends Beverage{
+
+ //为了要设置饮料的描述,我们写了一个构造器,description实例变量继承自Beverage
+ public DarkRoast() {
+ description = "Espresso";
+ }
+
+ //计算价格
+ @Override
+ public double cost() {
+ return 0.99;
+ }
+}
+
+class Decaf extends Beverage{
+
+ //为了要设置饮料的描述,我们写了一个构造器,description实例变量继承自Beverage
+ public Decaf() {
+ description = "Decaf";
+ }
+
+ //计算价格
+ @Override
+ public double cost() {
+ return 1.05;
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/Mocha.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/Mocha.java
new file mode 100644
index 0000000000000000000000000000000000000000..7da1e0276fe3c1579798b8b9a228b1b4921b31cd
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/Mocha.java
@@ -0,0 +1,67 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_2;
+
+import org.springframework.boot.autoconfigure.condition.ConditionMessage;
+
+/**
+ * Description: 摩卡--具体的装饰者实体类
+ * @author Lingwenjun
+ * @date 2019/1/29-15:14
+ * @version 1.0
+ */
+public class Mocha extends CondimentDecorator {
+
+ Beverage beverage;
+
+ public Mocha(Beverage beverage) {
+ this.beverage = beverage;
+ }
+
+ @Override
+ public String getDescription() {
+ return beverage.getDescription() + ", Mocha";
+ }
+
+ @Override
+ public double cost() {
+ return 0.2 + beverage.cost();
+ }
+}
+
+class Soy extends CondimentDecorator {
+
+ Beverage beverage;
+
+ public Soy(Beverage beverage) {
+ this.beverage = beverage;
+ }
+
+ @Override
+ public String getDescription() {
+ return beverage.getDescription() + ", Soy";
+ }
+
+ @Override
+ public double cost() {
+ return 0.15 + beverage.cost();
+ }
+}
+
+class Whip extends CondimentDecorator {
+
+ Beverage beverage;
+
+ public Whip(Beverage beverage) {
+ this.beverage = beverage;
+ }
+
+ @Override
+ public String getDescription() {
+ return beverage.getDescription() + ", Whip";
+ }
+
+ @Override
+ public double cost() {
+ return 0.1 + beverage.cost();
+ }
+}
+
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/other/LowerCaseInputStream.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/other/LowerCaseInputStream.java
new file mode 100644
index 0000000000000000000000000000000000000000..20b0e1f0ca81039d24a3504d45a1560aac413e5e
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/other/LowerCaseInputStream.java
@@ -0,0 +1,42 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_2.other;
+
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Description: 大写--> 小写
+ * 装饰器类,把输入流中的大写字符转化成小写字符,,主要是继承自 装饰器的抽象类
+ * @author Lingwenjun
+ * @date 2019/1/29-15:49
+ * @version 1.0
+ */
+public class LowerCaseInputStream extends FilterInputStream {
+ /**
+ * Creates a FilterInputStream
+ * by assigning the argument in
+ * to the field this.in so as
+ * to remember it for later use.
+ *
+ * @param in the underlying input stream, or null if
+ * this instance is to be created without an underlying stream.
+ */
+ protected LowerCaseInputStream(InputStream in) {
+ super(in);
+ }
+
+ @Override
+ public int read() throws IOException {
+ int c = super.read();
+ return (c == -1? c : Character.toLowerCase(c));
+ }
+
+ @Override
+ public int read(byte[] b, int off, int len) throws IOException {
+ int result = super.read(b, off, len);
+ for (int i = off; i < off + result; i++) {
+ b[i] = (byte) Character.toLowerCase(b[i]);
+ }
+ return result;
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/package-info.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..b890bd3843284f088a2c8efa03d5e64118b4802d
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/demo_2/package-info.java
@@ -0,0 +1,8 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator.demo_2;
+/**
+ * Description: demo2
+ * demo_2 来自于 <>中的装饰器模式的demo示例
+ * @author Lingwenjun
+ * @date 2019/1/29-15:07
+ * @version 1.0
+ */
\ No newline at end of file
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/package-info.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..ffa3a9aa3261e206d0d920cdd04cc84265f4a7ea
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/decorator/package-info.java
@@ -0,0 +1,13 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.decorator;
+/**
+ * Description: 装饰器模式
+ * 允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
+ *
+ * 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
+ *
+ * 优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
+ * 缺点:多层装饰比较复杂。
+ * @author Lingwenjun
+ * @date 2019/1/29-10:42
+ * @version 1.0
+ */
\ No newline at end of file
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/AndCriteria.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/AndCriteria.java
new file mode 100644
index 0000000000000000000000000000000000000000..1bd2a39ecc20fc934d06b3949b0d1ce15c19a6ad
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/AndCriteria.java
@@ -0,0 +1,28 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter;
+
+import java.util.List;
+
+/**
+ * Description: and标准的实体类实现接口
+ * @author Lingwenjun
+ * @date 2019/1/24-17:00
+ * @version 1.0
+ */
+public class AndCriteria implements Criteria{
+
+ private Criteria criteria;
+
+ private Criteria otherCriteria;
+
+ public AndCriteria(Criteria criteria, Criteria otherCriteria) {
+ this.criteria = criteria;
+ this.otherCriteria = otherCriteria;
+ }
+
+ @Override
+ public List meetCriteria(List persons) {
+ //过滤2次,剩下的是都符合过滤条件的
+ List firstCriteriaPerson = criteria.meetCriteria(persons);
+ return otherCriteria.meetCriteria(firstCriteriaPerson);
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/Criteria.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/Criteria.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7de168bdd572bd6c2c3c9f7d8a3a00e59314106
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/Criteria.java
@@ -0,0 +1,17 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter;
+
+import java.util.List;
+
+/**
+ * Description: 为标准(Criteria) 创建一个接口
+ * 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,
+ * 这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。
+ * 这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
+ * @author Lingwenjun
+ * @date 2019/1/24-16:49
+ * @version 1.0
+ */
+public interface Criteria {
+
+ List meetCriteria(List persons);
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/CriteriaFemale.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/CriteriaFemale.java
new file mode 100644
index 0000000000000000000000000000000000000000..9aa3e68592ccfe7c988ad1419154e680d99bda46
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/CriteriaFemale.java
@@ -0,0 +1,24 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description: 实现了Criteria的另一个标准实体类
+ * @author Lingwenjun
+ * @date 2019/1/24-16:53
+ * @version 1.0
+ */
+public class CriteriaFemale implements Criteria{
+ @Override
+ public List meetCriteria(List persons) {
+ List femalePersons = new ArrayList<>();
+
+ for (Person person : persons) {
+ if (person.getGender().equalsIgnoreCase("female")) {
+ femalePersons.add(person);
+ }
+ }
+ return femalePersons;
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/CriteriaMale.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/CriteriaMale.java
new file mode 100644
index 0000000000000000000000000000000000000000..7e6562a09266e0e02f8f9fb21cef1b3b8b261d78
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/CriteriaMale.java
@@ -0,0 +1,24 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description: 实现了标准Criteria的实体类
+ * @author Lingwenjun
+ * @date 2019/1/24-16:51
+ * @version 1.0
+ */
+public class CriteriaMale implements Criteria {
+ @Override
+ public List meetCriteria(List persons) {
+ List malePersons = new ArrayList<>();
+
+ for (Person person : persons) {
+ if (person.getGender().equalsIgnoreCase("male")) {
+ malePersons.add(person);
+ }
+ }
+ return malePersons;
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/CriteriaSingle.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/CriteriaSingle.java
new file mode 100644
index 0000000000000000000000000000000000000000..b9ef06aa77938bda37661f5989243365214a2387
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/CriteriaSingle.java
@@ -0,0 +1,24 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description: 实现了Criteria标准接口的另一个实体类
+ * @author Lingwenjun
+ * @date 2019/1/24-16:56
+ * @version 1.0
+ */
+public class CriteriaSingle implements Criteria{
+ @Override
+ public List meetCriteria(List persons) {
+ List singlePersons = new ArrayList<>();
+
+ for (Person person : persons) {
+ if (person.getStatus().equalsIgnoreCase("single")) {
+ singlePersons.add(person);
+ }
+ }
+ return singlePersons;
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/FilterPatternDemo.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/FilterPatternDemo.java
new file mode 100644
index 0000000000000000000000000000000000000000..4544575b83c3bd62575110f70af8b59f6df137af
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/FilterPatternDemo.java
@@ -0,0 +1,68 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter;
+
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+/**
+ * Description: test
+ * @author Lingwenjun
+ * @date 2019/1/24-17:08
+ * @version 1.0
+ */
+public class FilterPatternDemo {
+
+ public static void main(String[] args) {
+ List persons = new ArrayList<>();
+
+ persons.add(new Person("a1", "male", "single"));
+ persons.add(new Person("b1", "female", "married"));
+ persons.add(new Person("c1", "male", "single"));
+ persons.add(new Person("d1", "female", "married"));
+ persons.add(new Person("e1", "male", "married"));
+ persons.add(new Person("f1", "female", "single"));
+
+ Criteria male = new CriteriaMale();
+ Criteria female = new CriteriaFemale();
+ Criteria single = new CriteriaSingle();
+ Criteria singleMale = new AndCriteria(male, single);
+ Criteria singleFemale = new AndCriteria(female, single);
+ Criteria singleOrFemale = new OrCriteria(single, female);
+
+ System.out.println("males:");
+ male.meetCriteria(persons).forEach(System.out::println);
+
+ System.out.println("females:");
+ female.meetCriteria(persons).forEach(System.out::println);
+
+ System.out.println("singleAndMales:");
+ singleMale.meetCriteria(persons).forEach(System.out::println);
+
+ System.out.println("singleAndFemales:");
+ singleFemale.meetCriteria(persons).forEach(System.out::println);
+
+ System.out.println("singleOrFemales:");
+ singleOrFemale.meetCriteria(persons).forEach(System.out::println);
+
+ System.out.println("=======================================");
+ //类似jdk1.8的 分组筛选
+ persons.stream().filter(person -> person.getGender().equalsIgnoreCase("male")).forEach(System.out::println);
+ //多个条件判断
+ System.out.println("=================mutil predicate======================");
+ persons.stream().filter(person -> person.getGender().equalsIgnoreCase("male")
+ && person.getStatus().equalsIgnoreCase("single")).forEach(System.out::println);
+
+ //分组筛选
+ System.out.println("==================groupingBy=====================");
+ persons.stream().collect(Collectors.groupingBy(Person::getGender))//按照性别分组
+ .forEach((k, v) -> {
+ System.out.println("k = " + k);
+ v.forEach(System.out::println);
+ });
+
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/OrCriteria.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/OrCriteria.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf95fd1fd0a59856494915e4db6c1358e7acf539
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/OrCriteria.java
@@ -0,0 +1,35 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter;
+
+import java.util.List;
+
+/**
+ * Description: Or Criteria的接口实现的实体类
+ * @author Lingwenjun
+ * @date 2019/1/24-17:04
+ * @version 1.0
+ */
+public class OrCriteria implements Criteria{
+
+ private Criteria criteria;
+
+ private Criteria otherCriteria;
+
+ public OrCriteria(Criteria criteria, Criteria otherCriteria) {
+ this.criteria = criteria;
+ this.otherCriteria = otherCriteria;
+ }
+
+ @Override
+ public List meetCriteria(List persons) {
+ List firstCriteriaItems = criteria.meetCriteria(persons);
+ List otherCriteriaItems = otherCriteria.meetCriteria(persons);
+
+ //把2种或条件符合的 合并到第一个条件中去
+ for (Person person : otherCriteriaItems) {
+ if (!firstCriteriaItems.contains(person)) {
+ firstCriteriaItems.add(person);
+ }
+ }
+ return firstCriteriaItems;
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/Person.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/Person.java
new file mode 100644
index 0000000000000000000000000000000000000000..925c22d82e16fdd7f97703b6475c5a690e5f9cb9
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/Person.java
@@ -0,0 +1,23 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * Description: 创建一个Person类,在该类上应用标准
+ * @author Lingwenjun
+ * @date 2019/1/24-16:47
+ * @version 1.0
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Person {
+
+ private String username;
+
+ private String gender;
+
+ private String status;
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/AuthenticationFilter.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/AuthenticationFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..5911f58dfac9bb0c6ac51e42353e424e60a36cb2
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/AuthenticationFilter.java
@@ -0,0 +1,13 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter.demo_2;
+/**
+ * Description: 具体的过滤器类
+ * @author Lingwenjun
+ * @date 2019/1/24-18:30
+ * @version 1.0
+ */
+public class AuthenticationFilter implements Filter{
+ @Override
+ public void execute(String request) {
+ System.out.println("AuthenticationFilter request = [" + request + "]");
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/Client.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..5820db010970dd705b2aaf99128fc88a108ddfdb
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/Client.java
@@ -0,0 +1,19 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter.demo_2;
+/**
+ * Description: 创建客户端
+ * @author Lingwenjun
+ * @date 2019/1/25-10:30
+ * @version 1.0
+ */
+public class Client {
+
+ private FilterManager filterManager;
+
+ public void setFilterManager(FilterManager filterManager) {
+ this.filterManager = filterManager;
+ }
+
+ public void sendRequest(String request) {
+ filterManager.filterRequest(request);
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/DebugFilter.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/DebugFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..4a439111573a7e769f84bbc199d3d3ffaa1ef16f
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/DebugFilter.java
@@ -0,0 +1,13 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter.demo_2;
+/**
+ * Description: 具体的过滤器类
+ * @author Lingwenjun
+ * @date 2019/1/24-18:31
+ * @version 1.0
+ */
+public class DebugFilter implements Filter{
+ @Override
+ public void execute(String request) {
+ System.out.println("DebugFilter request = [" + request + "]");
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/Filter.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/Filter.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b7c35513ad916c3e1dce4267cb7aa07b4697333
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/Filter.java
@@ -0,0 +1,11 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter.demo_2;
+/**
+ * Description: 过滤器的抽象接口
+ * @author Lingwenjun
+ * @date 2019/1/24-18:29
+ * @version 1.0
+ */
+public interface Filter {
+
+ void execute(String request);
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/FilterChain.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/FilterChain.java
new file mode 100644
index 0000000000000000000000000000000000000000..7941f7d6f3ba917f9716a99176b04e03e16f70a3
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/FilterChain.java
@@ -0,0 +1,32 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter.demo_2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description: 创建过滤器链
+ * @author Lingwenjun
+ * @date 2019/1/24-18:34
+ * @version 1.0
+ */
+public class FilterChain {
+
+ private List filters = new ArrayList<>();
+
+ private Target target;
+
+ public void addFilter(Filter filter) {
+ filters.add(filter);
+ }
+
+ public void setTarget(Target target) {
+ this.target = target;
+ }
+
+ public void execute(String request) {
+ for (Filter filter : filters) {
+ filter.execute(request);
+ }
+ target.execute(request);
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/FilterDemoTest.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/FilterDemoTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b068823f8020077e4ae2de649878acd001fd90c7
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/FilterDemoTest.java
@@ -0,0 +1,19 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter.demo_2;
+/**
+ * Description: TODO
+ * @author Lingwenjun
+ * @date 2019/1/25-10:31
+ * @version 1.0
+ */
+public class FilterDemoTest {
+
+ public static void main(String[] args) {
+ FilterManager filterManager = new FilterManager(new Target());
+ filterManager.setFilter(new AuthenticationFilter());
+ filterManager.setFilter(new DebugFilter());
+
+ Client client = new Client();
+ client.setFilterManager(filterManager);
+ client.sendRequest("HOME");
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/FilterManager.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/FilterManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..3f13aa9ecdd7bf0c99a01de02b8e47de26d3cea9
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/FilterManager.java
@@ -0,0 +1,24 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter.demo_2;
+/**
+ * Description: 创建筛选管理器
+ * @author Lingwenjun
+ * @date 2019/1/25-10:27
+ * @version 1.0
+ */
+public class FilterManager {
+
+ FilterChain filterChain;
+
+ public FilterManager(Target target) {
+ filterChain = new FilterChain();
+ filterChain.setTarget(target);
+ }
+
+ public void setFilter(Filter filter) {
+ filterChain.addFilter(filter);
+ }
+
+ public void filterRequest(String request) {
+ filterChain.execute(request);
+ }
+}
diff --git a/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/Target.java b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/Target.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3e1de54f89cc5bd4457a483f2918d2248117835
--- /dev/null
+++ b/springboot-designpatterns/src/main/java/com/liangwj/springbootdesignpatterns/structureTypePatterns/filter/demo_2/Target.java
@@ -0,0 +1,13 @@
+package com.liangwj.springbootdesignpatterns.structureTypePatterns.filter.demo_2;
+/**
+ * Description: 目标类
+ * @author Lingwenjun
+ * @date 2019/1/24-18:32
+ * @version 1.0
+ */
+public class Target {
+
+ public void execute(String request) {
+ System.out.println("Target request = [" + request + "]");
+ }
+}