• 徒手撸设计模式访问者模式


    概念

    在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

    参考链接: https://www.runoob.com/design-pattern/visitor-pattern.html

    代码案例

    电脑部件接口-接收电脑部件访问者

    /**
     * 电脑部件接口
     */
    public interface ComputerPart {
    
        public String accept(ComputerPartVisitor computerPartVisitor);
    }

    电脑部件访问者接口,提供四个部件访问

    /**
     * 访问者接口
     */
    
    public interface ComputerPartVisitor {
    
        String visit(Computer computer);
    
        String visit(Mouse mouse);
    
        String visit(Keyboard keyboard);
    
        String visit(Monitor monitor);
    }

    电脑部件实现类

    鼠标

    /**
     * 鼠标
     */
    public class Mouse implements ComputerPart {
        @Override
        public String accept(ComputerPartVisitor computerPartVisitor) {
            return computerPartVisitor.visit(this);
        }
    }

    显示器

    /**
     * 显示器
     */
    public class Monitor implements ComputerPart {
        @Override
        public String accept(ComputerPartVisitor computerPartVisitor) {
            return computerPartVisitor.visit(this);
        }
    }

    键盘

    /**
     * 键盘
     */
    public class Keyboard implements ComputerPart {
        @Override
        public String accept(ComputerPartVisitor computerPartVisitor) {
            return computerPartVisitor.visit(this);
        }
    }

    电脑

    /**
     * 电脑 统一访问入口
     */
    public class Computer implements ComputerPart {
        ComputerPart[] computerParts;
    
        public Computer() {
            computerParts = new ComputerPart[]{new Monitor(),new Mouse(),new Keyboard()};
        }
    
        @Override
        public String accept(ComputerPartVisitor computerPartVisitor) {
            for (ComputerPart computerPart : computerParts) {
                computerPart.accept(computerPartVisitor);
            }
            return computerPartVisitor.visit(this);
        }
    }

    电脑部件访问实现类

    /**
     * 电脑部件访问实现类
     */
    @Slf4j
    public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
        @Override
        public String visit(Computer computer) {
            log.info("访问电脑---");
            return "Displaying Computer.";
        }
    
        @Override
        public String visit(Mouse mouse) {
            log.info("访问电脑鼠标---");
            return "Displaying Mouse.";
        }
    
        @Override
        public String visit(Keyboard keyboard) {
            log.info("访问电脑键盘---");
            return "Displaying Keyboard.";
        }
    
        @Override
        public String visit(Monitor monitor) {
            log.info("访问电脑显示器---");
            return "Displaying Monitor.";
        }
    }

    测试主类

    /**
     * 设计模式控制器
     */
    @RestController
    @RequestMapping("/designPattern")
    @Slf4j
    public class DesignController {
        @Autowired
        private ApplicationContext applicationContext;
    
        @GetMapping("/visitor")
        public ResponseModel visitor() throws Exception {
            log.info("visitor   ---- start ");
    
            Computer computer= new Computer();
            ComputerPartDisplayVisitor computerPartDisplayVisitor = new ComputerPartDisplayVisitor();
            computer.accept(computerPartDisplayVisitor);
    
            log.info("visitor   ---- end ");
            return new ResponseModel("访问者模式完成", 200, null);
        }
    }

    测试案例

    2022-07-02 18:36:44.306 INFO  visitor   ---- start  【http-nio-8081-exec-2】【DesignController:882022-07-02 18:36:53.528 INFO  访问电脑显示器--- 【http-nio-8081-exec-2】【ComputerPartDisplayVisitor:282022-07-02 18:36:53.537 INFO  访问电脑鼠标--- 【http-nio-8081-exec-2】【ComputerPartDisplayVisitor:162022-07-02 18:36:53.539 INFO  访问电脑键盘--- 【http-nio-8081-exec-2】【ComputerPartDisplayVisitor:222022-07-02 18:36:53.541 INFO  访问电脑--- 【http-nio-8081-exec-2】【ComputerPartDisplayVisitor:102022-07-02 18:36:57.802 INFO  visitor   ---- end  【http-nio-8081-exec-2】【DesignController:94】

     

  • 相关阅读:
    2020916 spring总结
    20200915--事务
    20200915-mybatis基础
    20200911--使用注解开发
    20200910--Spring配置
    20200909--spring基础-IOC
    20200909-待补充
    20200909记我所看到的问题
    20200909-spring基础一
    面向对象
  • 原文地址:https://www.cnblogs.com/hikoukay/p/16438189.html
Copyright © 2020-2023  润新知