diff --git a/README.md b/README.md index 3348ebd0a73787c4e19f3e39bcfbace10213fdd6..d3c86a170bf8749ced4595e46f0ddfebbcf2ea81 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Fork me on Gitee](https://gitee.com/blackshao/springbootlearn/widgets/widget_6.svg)](https://gitee.com/blackshao/springbootlearn) # springbootlearn #### Schedule **module:2019-1-23** @@ -55,4 +56,5 @@ springbootlearn 一起学习springboot, 4. 代码提交,分支合并请先meger到 develop分支.后续测试,接收才并到master发布. -#### 会员风采的栏目 +#### 会员风采的栏目 +[![Fork me on Gitee](https://gitee.com/blackshao/springbootlearn/widgets/widget_3.svg)](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 + "]"); + } +}