ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-02 19:01:38  阅读:421  来源: 互联网

标签:String 电脑 访问者 visit computerPartVisitor 设计模式 public 徒手


概念

在访问者模式(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:88】
2022-07-02 18:36:53.528 INFO  访问电脑显示器--- 【http-nio-8081-exec-2】【ComputerPartDisplayVisitor:28】
2022-07-02 18:36:53.537 INFO  访问电脑鼠标--- 【http-nio-8081-exec-2】【ComputerPartDisplayVisitor:16】
2022-07-02 18:36:53.539 INFO  访问电脑键盘--- 【http-nio-8081-exec-2】【ComputerPartDisplayVisitor:22】
2022-07-02 18:36:53.541 INFO  访问电脑--- 【http-nio-8081-exec-2】【ComputerPartDisplayVisitor:10】
2022-07-02 18:36:57.802 INFO  visitor   ---- end  【http-nio-8081-exec-2】【DesignController:94】

 

 

标签:String,电脑,访问者,visit,computerPartVisitor,设计模式,public,徒手
来源: https://www.cnblogs.com/hikoukay/p/16438189.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有