visitor模式

场景

(1)组合模式,我们现在想象一下,我们之前做的是说递归删除部门自己本身 (2)但是我们现在要对他改造一下,将组合模式和访问者模式结合起来,就是说,我们可以让那颗树执行我们想要他做的任何事情

1.访问者模式

  1. package com.example.demo.pattern.visitor;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. * @author chenchao
  6. * @date 2021/11/9
  7. */
  8. public class VisitorPatternDemo {
  9. public static void main(String[] args) {
  10. Department leafDept1 = new Department("叶子部门1");
  11. Department leafDept2 = new Department("叶子部门2");
  12. Department leafDept3 = new Department("叶子部门3");
  13. Department subDept1 = new Department("子部门1");
  14. subDept1.getChildren().add(leafDept1);
  15. subDept1.getChildren().add(leafDept2);
  16. Department subDept2 = new Department("子部门2");
  17. subDept2.getChildren().add(leafDept3);
  18. Department parentDept = new Department("父部门");
  19. parentDept.getChildren().add(subDept1);
  20. parentDept.getChildren().add(subDept2);
  21. Visitor removeVisitor = new RemoveVisitor();
  22. parentDept.accept(removeVisitor);
  23. Visitor updateStatusVisitor = new UpdateStatusVisitor("禁用");
  24. parentDept.accept(updateStatusVisitor);
  25. // 访问者模式,一般来说,就是跟组合模式结合起来使用的
  26. // 组合模式代表了一种复杂的对象的类型
  27. // 如果你后面要给树形的数据结构增加个什么功能,修改代码可能会比较麻烦
  28. // 但是如果采用访问者模式来做,你可以在任何时候给树形的数据结构增加任何的功能
  29. }
  30. public static class Department {
  31. private String name;
  32. private List<Department> children = new ArrayList<Department>();
  33. public Department(String name) {
  34. super();
  35. this.name = name;
  36. }
  37. public String getName() {
  38. return name;
  39. }
  40. public void setName(String name) {
  41. this.name = name;
  42. }
  43. public List<Department> getChildren() {
  44. return children;
  45. }
  46. public void setChildren(List<Department> children) {
  47. this.children = children;
  48. }
  49. public void accept(Visitor visitor) {
  50. visitor.visit(this);
  51. }
  52. }
  53. public interface Visitor {
  54. void visit(Department dept);
  55. }
  56. public static class RemoveVisitor implements Visitor {
  57. @Override
  58. public void visit(Department dept) {
  59. if(dept.getChildren().size() > 0) {
  60. for(Department child : dept.getChildren()) {
  61. child.accept(this);
  62. }
  63. }
  64. System.out.println("删除部门【" + dept.getName() + "】");
  65. }
  66. }
  67. public static class UpdateStatusVisitor implements Visitor {
  68. private String status;
  69. @Override
  70. public void visit(Department dept) {
  71. if(dept.getChildren().size() > 0) {
  72. for(Department child : dept.getChildren()) {
  73. child.accept(this);
  74. }
  75. }
  76. System.out.println("将部门【" + dept.getName() + "】的状态修改为:" + status);
  77. }
  78. public UpdateStatusVisitor(String status) {
  79. this.status = status;
  80. }
  81. }
  82. }

2.说明

访问者模式,是对目标对象,动态的执行某个功能,而不对目标对象有任何的改动