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

概念

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

参考链接: 访问者模式 | 菜鸟教程

代码案例

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

/**
 * 电脑部件接口
 */
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】

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值