gpt4 book ai didi

c# - 访客模式可以用回调函数代替吗?

转载 作者:太空狗 更新时间:2023-10-29 22:16:33 25 4
gpt4 key购买 nike

使用这两种技术有什么显着的好处吗?如果有变化,我的意思是访问者模式是这样的:http://en.wikipedia.org/wiki/Visitor_pattern

下面是一个使用delegate实现同样效果的例子(至少我觉得是一样的)

假设有一个嵌套元素的集合:Schools 包含 Departments,Departments 包含 Students

与其使用访问者模式对每个集合项执行某些操作,不如使用简单的回调(C# 中的 Action 委托(delegate))

这样说

class Department
{
List Students;
}

class School
{
List Departments;

VisitStudents(Action<Student> actionDelegate)
{
foreach(var dep in this.Departments)
{
foreach(var stu in dep.Students)
{
actionDelegate(stu);
}
}
}
}

School A = new School();
...//populate collections

A.Visit((student)=> { ...Do Something with student... });

*EDIT 委托(delegate)接受多个参数的示例

假设我想通过学生和部门,我可以像这样修改 Action 定义: Action

class School
{
List Departments;

VisitStudents(Action<Student, Department> actionDelegate, Action<Department> d2)
{
foreach(var dep in this.Departments)
{
d2(dep); //This performs a different process.
//Using Visitor pattern would avoid having to keep adding new delegates.
//This looks like the main benefit so far
foreach(var stu in dep.Students)
{
actionDelegate(stu, dep);
}
}
}
}

最佳答案

当有不止一种类型的事物被访问时,通常使用访问者模式。您只有一种类型(Student),因此您实际上并不需要访问者模式,只需传入一个委托(delegate)实例即可。

假设您想要访问 DepartmentStudent。那么你的访问者看起来像这样:

interface ISchoolVisitor
{
void Visit(Department department);
void Visit(Student student);
}

当然,您也可以在这里使用委托(delegate),但是传入多个委托(delegate)实例会很麻烦——尤其是当您有超过 2 种类型的访问对象时。

关于c# - 访客模式可以用回调函数代替吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13772168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com