代码改变世界

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

2022-07-02 18:51  hikoukay  阅读(15)  评论(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】