怎么称呼这种实施模式

时间:2014-09-26 18:33:14

标签: c# design-patterns naming-conventions

在下面的代码中,我意识到将它们命名为“Sender”可能是错误的,并且Send方法最好移动到另一个类。

真正发生的是从多个来源创建单一类型的对象,每个来源包含一些常见输入(在基础发件人中处理)和更具体的输入(在派生发件人中处理)。

假设我将Send方法移到辅助类中,我应该将这些类重命名为什么?

abstract class LoanEventSenderBase<T> where T : LoanEvent, new()
{
    protected readonly T LoanEvent;
    protected string Topic;

    protected LoanEventSenderBase(ILoans loans)
    {
        LoanEvent = new T
        {
            LoanNumber = loans.CurrentLoan.LoanNumber,
            LasedUsedByUser = loans.UserFullName
        };
    }
    public void Send() {
    }
}
class LoanMajorEventSender : LoanEventSenderBase<LoanMajorEvent>
{
    public LoanMajorEventSender(ILoans loans, int majorEventNum)
        : base(loans)
    {
        LoanEvent.MajorEventNum = majorEventNum;
        Topic = string.Format("{0}.{1}", LoanEvent.GetType().Name, LoanEvent.MajorEventNum);
    }
}
class LoanFieldEventSender : LoanEventSenderBase<LoanFieldEvent>
{
    public LoanFieldEventSender(ILoans loans, LoanFieldEventArgs loanFieldEventArgs)
        : base(loans)
    {
        LoanEvent.OldValue = loanFieldEventArgs.OldValue.ToString();
        LoanEvent.NewValue = loanFieldEventArgs.NewValue.ToString();
        LoanEvent.FieldName = loanFieldEventArgs.LoanField.DataDefinition.XmlName;
        LoanEvent.FieldNumber = loanFieldEventArgs.LoanField.DataDefinition.FieldNumber;
        Topic = string.Format("{0}.{1}", LoanEvent.GetType().Name, LoanEvent.FieldNumber);
    }
}

2 个答案:

答案 0 :(得分:1)

我已经接受了建设者的建议。

class Message<T> where T : LoanEvent
{
    public T LoanEvent { get; protected set; }
    public string Topic { get; protected set; }
}
class MessageSender
{
    public void Send<T>(Message<T> message) where T : LoanEvent
    {
    }
}
abstract class MessageBuilder<T> : Message<T> where T : LoanEvent, new()
{
    protected MessageBuilder(ILoans loans)
    {
        LoanEvent = new T
        {
            LoanNumber = loans.CurrentLoan.LoanNumber,
            LasedUsedByUser = loans.UserFullName
        };
    }
}
class LoanMajorEventMessageBuilder : MessageBuilder<LoanMajorEvent>
{
    public LoanMajorEventMessageBuilder(ILoans loans, int majorEventNum)
        : base(loans)
    {
        LoanEvent.MajorEventNum = majorEventNum;
        Topic = string.Format("{0}.{1}", LoanEvent.GetType().Name, LoanEvent.MajorEventNum);
    }
}
class LoanFieldEventMessageBuilder : MessageBuilder<LoanFieldEvent>
{
    public LoanFieldEventMessageBuilder(ILoans loans, LoanFieldEventArgs loanFieldEventArgs)
        : base(loans)
    {
        LoanEvent.OldValue = loanFieldEventArgs.OldValue.ToString();
        LoanEvent.NewValue = loanFieldEventArgs.NewValue.ToString();
        LoanEvent.FieldName = loanFieldEventArgs.LoanField.DataDefinition.XmlName;
        LoanEvent.FieldNumber = loanFieldEventArgs.LoanField.DataDefinition.FieldNumber;
        Topic = string.Format("{0}.{1}", LoanEvent.GetType().Name, LoanEvent.FieldNumber);
    }
}

答案 1 :(得分:0)

对我而言,此实现看起来更像是Command design pattern的一部分。它将请求封装为对象,从而允许使用不同的请求,队列或日志请求等对客户端进行参数化。

  

命名他们“发件人”可能是错误的,Sendmethod最好被移到另一个班级。

您可以使用 CommandInvoker 类,如前面提到的模式所示。