代码改变世界

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

  hikoukay  阅读(17)  评论(0编辑  收藏  举报

概念

在访问者模式(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】

 

 

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示