首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

设计模式-访问者模式

定义

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

访问者模式的关键点如下:

定义一个访问者对象,它包含一个或多个对象。

定义一个接口,用于定义访问者对象的操作。

在接口中声明一个方法,用于获取对象的状态。

在接口中声明一个方法,用于修改对象的状态。

将访问者对象与需要获取或修改的对象建立引用关系。

访问者对象可以访问或修改它所引用的对象的状态。

用途

稳定的数据结构和易变的操作耦合问题。

访问者模式是一种非常有用的设计模式,它可以帮助我们抽象出对象之间的访问关系,并可以方便地实现多态。访问者模式的应用场景包括但不限于:

需要对外部用户进行状态持久化存储的对象,如数据库中的记录。

需要对对象的状态进行同步的对象,如多用户并发访问的对象。

需要对对象的状态进行修改的对象,如计数器。

需要对对象的状态进行优先级排序的对象,如用户等级查询系统。

需要对对象的状态进行事务的对象,如分布式事务。

示例

以显示计算机的组成部分为例,主要分五步实现:

定义一个表示元素的接口。

public interface ComputerPart {

public void accept(ComputerPartVisitor computerPartVisitor);

}

创建扩展了上述类的实体类。Keyboard、Monitor、Mouse、Computer

public class Computer implements ComputerPart {

private ComputerPart[] parts;

public Computer() {

this.parts = new ComputerPart[]{new Mouse(), new Keyboard(), new Monitor()};

}

@Override

public void accept(ComputerPartVisitor computerPartVisitor) {

for (ComputerPart part : parts) {

part.accept(computerPartVisitor);

}

computerPartVisitor.visit(this);

}

}

public class Mouse implements ComputerPart {

@Override

public void accept(ComputerPartVisitor computerPartVisitor) {

computerPartVisitor.visit(this);

}

}

定义一个表示访问者的接口。

public interface ComputerPartVisitor {

public void visit(Computer computer);

public void visit(Mouse mouse);

public void visit(Keyboard keyboard);

public void visit(Monitor monitor);

}

创建实现了上述类的实体访问者。

public class ComputerPartDisplayVisitor implements ComputerPartVisitor {

@Override

public void visit(Computer computer) {

Log.e("---", "Displaying Computer.");

}

@Override

public void visit(Mouse mouse) {

Log.e("---", "Displaying Mouse.");

}

@Override

public void visit(Keyboard keyboard) {

Log.e("---", "Displaying Keyboard.");

}

@Override

public void visit(Monitor monitor) {

Log.e("---", "Displaying Monitor.");

}

}

使用 ComputerPartDisplayVisitor 来显示 Computer 的组成部分。

ComputerPart computer = new Computer();

computer.accept(new ComputerPartDisplayVisitor());

/*

*打印:

*---: Displaying Mouse.

*---: Displaying Keyboard.

*---: Displaying Monitor.

*---: Displaying Computer.

*/

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OqixhZYqxBERTcbMkIWdW2sw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券