gpt4 book ai didi

design-patterns - 关于使用命令设计模式的思考

转载 作者:行者123 更新时间:2023-12-04 21:51:15 25 4
gpt4 key购买 nike

我有一些代码可以更新要发送电子邮件的人员列表。此列表经常更新,在调用代码的实际“发送电子邮件”部分之前添加和删除人员。目前我处理这个问题的代码是这样的:

if (instructorEmailType == InstructorEmailType.AddToCourse)
{
// If instructor not already in the list, then put them in.
if (!this.InstructorsToEmail.ContainsKey(courseInstructor))
{
this.InstructorsToEmail.Add(courseInstructor, InstructorEmailType.AddToCourse);
}
else
{
// If instructor already in the list, and marked for removal, then get rid
// of that entry from the list.
if (this.InstructorsToEmail[courseInstructor] == InstructorEmailType.RemoveFromCourse)
{
this.InstructorsToEmail.Remove(courseInstructor);
}
}
}
else
{
if (this.InstructorsToEmail.ContainsKey(courseInstructor))
{
this.InstructorsToEmail.Remove(courseInstructor);
}
else
{
this.InstructorsToEmail.Add(courseInstructor, InstructorEmailType.RemoveFromCourse);
}
}

这很复杂,我不喜欢它。我一直在考虑实现 Command而是设计模式。我的想法是创建两个命令:
  • SendAllocatedInstructorEmailCommand
  • SendDeallocatedInstructorEmailCommand

  • 当一名教师被分配到一门类(class)时,我会新建一个 SendAllocatedInstructorEmailCommand并将其添加到 CommandInvoker.SetCommand供以后使用。同样,我会创建一个 SendDeallocatedInstructorEmailCommand反对那些被取消类(class)的教师。

    那就是问题所在。

    如果我创建了 SendAllocatedInstructorEmailCommand Instructor A 的对象之后是 Instructor A已从类(class)中解除分配(在页面上的任何数据已保存或发送电子邮件之前),那么我需要删除 SendAllocatedInstructorEmailCommand我之前 build 的。

    搜索已经引用 Instructor A 的命令的干净方法是什么? ,以便我可以删除它们?我不能使用 Undo我的命令上的方法,因为电子邮件将已经通过 SendAllocatedInstructorEmailCommand 发送.

    我正在考虑添加某种 Query我的方法 CommandInvoker反对,但我不确定这是否是一个糟糕的计划。

    我应该使用 Command设计模式?它确实是对这些电子邮件进行排队的一种非常好的方式。

    干杯。
    贾斯。

    最佳答案

    我会说你应该保留你的命令,只是将它们与发送任何电子邮件分离。

    你的命令应该像 IncludeInstructorEmailExcludeInstructorEmail ,它们都应该实现一个接口(interface),就像这样

    public interface ICommandOverEmailsList
    {
    void ApplyToList(List<string> emailsList);
    }

    那么主要部分的代码将是这样的:
    List<string> emailsList = new List<string>();
    foreach(var command in instructorEmailsCommandsQueue)
    {
    command.ApplyToList(emailsList);
    }
    SendEmails(emailsList);

    当然,这假设诸如“排除 X,包含 X”之类的命令序列会将地址 X 留在列表中。这似乎与您的原始代码逻辑不同,但它真的需要吗?

    关于design-patterns - 关于使用命令设计模式的思考,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4016095/

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