专业的编程技术博客社区

网站首页 > 博客文章 正文

27、【访问者模式】将数据结构与数据操作分离

baijin 2024-10-01 07:32:29 博客文章 8 ℃ 0 评论

你好,我是程序员雪球。

今天我们来聊聊 23 种设计模式中,一种不常见行为型模式,访问者模式。聊聊它的设计思想、实现原理,应用场景,以及如何使用。

一、设计思想

访问者模式的主要思想是将数据结构与数据操作分离,使得数据结构可以相对稳定,而操作可以灵活地扩展和变化。它通过定义一个访问者接口,让不同的具体访问者实现对数据结构中元素的不同操作。

二、实现原理

访问者模式主要涉及以下几个角色:

1. 元素(Element):定义一个接受访问者访问的接口。

2. 具体元素(ConcreteElement):实现元素接口,提供具体的数据。

3. 访问者(Visitor):定义对元素进行操作的接口。

4. 具体访问者(ConcreteVisitor):实现访问者接口,提供具体的操作逻辑。

三、应用场景

1. 当需要对一个复杂的数据结构进行多种不同的操作,且这些操作彼此相对独立时。

2. 当需要在不改变数据结构的前提下,添加新的操作时。

四、Java 实现例子 - 员工信息统计

1. 员工接口

java 复制

interface Employee {

void accept(Visitor visitor);

}


2. 具体员工类

java 复制

class Engineer implements Employee {

private String name;


public Engineer(String name) {

this.name = name;

}


@Override

public void accept(Visitor visitor) {

visitor.visit(this);

}


public String getName() {

return name;

}

}


java 复制

class Manager implements Employee {

private String name;


public Manager(String name) {

this.name = name;

}


@Override

public void accept(Visitor visitor) {

visitor.visit(this);

}


public String getName() {

return name;

}

}


3. 访问者接口

java 复制

interface Visitor {

void visit(Engineer engineer);


void visit(Manager manager);

}


4. 具体访问者类 - 统计员工数量

java 复制

class EmployeeCounter implements Visitor {

private int engineerCount;

private int managerCount;


@Override

public void visit(Engineer engineer) {

engineerCount++;

}


@Override

public void visit(Manager manager) {

managerCount++;

}


public int getEngineerCount() {

return engineerCount;

}


public int getManagerCount() {

return managerCount;

}

}


5. 使用示例

java 复制

public class VisitorExample {

public static void main(String[] args) {

Employee engineer1 = new Engineer("张三");

Employee engineer2 = new Engineer("李四");

Employee manager1 = new Manager("王五");


EmployeeCounter counter = new EmployeeCounter();


engineer1.accept(counter);

engineer2.accept(counter);

manager1.accept(counter);


System.out.println("工程师数量: " + counter.getEngineerCount());

System.out.println("经理数量: " + counter.getManagerCount());

}

}


在这个例子中,我们通过访问者模式实现了对员工信息的统计,不同的访问者可以根据需要对员工数据进行不同的操作。访问者模式使得数据结构和操作的扩展性得到了很好的保障。


总结

一、设计思想

访问者模式的主要思想是将数据结构与数据操作分离。

二、实现原理

定义访问者类和元素类。

三、应用场景

1. 当需要对一个复杂的数据结构进行多种不同的操作,且这些操作彼此相对独立时。

2. 当需要在不改变数据结构的前提下,添加新的操作时。


讨论环节

为了方便你理解和巩固今天的内容,我给你留下两个讨论题,请在评论区与我一起讨论吧。

1. 访问者模式的核心设计思想是什么?

2. 请说说你用过访问者模式的场景?

如果觉得有收获,请双击支持,关注,后期我会持续更新更多相关知识。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表