【问题标题】:Which design pattern to use for flexible Message Sending?哪种设计模式用于灵活的消息发送?
【发布时间】:2013-07-21 14:12:19
【问题描述】:

我需要实现基于角色的消息发送功能。

  • 角色 A:应通过电子邮件和短信发送消息
  • 角色 B:只能通过电子邮件发送消息
  • 角色 C:消息只能通过短信发送
  • 角色 D:消息应由 Twitter 发送

我必须适应有关哪些角色可以使用哪些消息发送功能的更改,例如我需要能够更改角色 B 以包括短信。任何角色都可能需要任何消息发送功能。

我考虑过使用一个带有方法 SendMessage 的接口 IMessageChannel。然后是三个实现该接口的类,例如电子邮件、短信和推特。我正在考虑使用策略模式和工厂?这是正确的吗?

我应该考虑哪些设计模式来实现这个?

【问题讨论】:

  • 除了实现 IMessageChannel 的三个类之外,您还希望创建一个使用复合模式的具体类 MultiChannel,以便您可以将多个 MessageChannel 放入类中并将它们视为一个。然后,您的工厂可以根据角色规则将电子邮件、短信和推特消息通道推送到多通道,并将其传递给使用客户端。

标签: c# design-patterns


【解决方案1】:
I am thinking of below solution:
Interface IMessageSystem
{
void Send();
}
Public class Email : IMessageSystem
{
   public void Send()
  {
    console.writeline("Message From Email");
  }
}
Public class SMS : IMessageSystem
{
   public void Send()
  {
    console.writeline("Message From SMS");
  }
}
Public class Twitter : IMessageSystem
{
   public void Send()
  {
    console.writeline("Message From Twitter");
  }
}
Interface ISendMessageStrategy
{
  void SendMessages();
}
Public class SendMessageStrategyForRoleA : ISendMessageStrategy
{
   Public void SendMessages()
  {
    Email objemail = new Email();
   objemail.Send();
   SMS objSMS = new SMS();
   objSMS .Send();
   Twitter objtwitter = new Twitter();
   objtwitter.Send();   
  }
}
Public class SendMessageStrategyForRoleB : ISendMessageStrategy
{
   Public void SendMessages()
  {
   SMS objSMS = new SMS();
   objSMS .Send();
  }
}
Public class SendMessageStrategyForRoleC  : ISendMessageStrategy
{
  Public void SendMessages()
  {  
    Twitter objtwitter = new Twitter();
    objtwitter.Send();
  }
}
Public class SendMessageSystem
{    
   public ISendMessageStrategy sendMessageStrategy;
   List<Keyvaluepair<string,ISendMessageStrategy>> lstkeyval = new List<Keyvaluepair<string,ISendMessageStrategy();
   public SendMessageSystem(string role)
   {
       lstkeyval.add(new keyvaluepair<string,ISendMessageStrategy>("A",new SendMessageStrategyForRoleA()));
       lstkeyval.add(new keyvaluepair<string,ISendMessageStrategy>("B",new SendMessageStrategyForRoleB()));
       lstkeyval.add(new keyvaluepair<string,ISendMessageStrategy>("C",new SendMessageStrategyForRoleC()));
       sendMessageStrategy = lstkeyval.where(x=>x.Key == role).Value;
   }
   public void SendMessage ()
   {
       sendMessageStrategy.SendMessages();
   }
}
public class programme
{
   static void main (string[] args)
   {
     SendMessageSystem objMessage = new SendMessageSystem("A");
     objMessage.SendMessage();
   }
}

【讨论】:

    【解决方案2】:

    您似乎需要“Chain of Responsibility”模式。 例子是java的,但是原理是一样的。

    创建一个抽象处理程序并为每个角色实现一个子类。

    抽象处理程序:

    class abstract Handler{
     Handler succesor;
     Role ROLE;
    
     Handler(Handler succesor, Role role){
         this.succesor = succesor;
         this.ROLE = role
     }
    
     void sendMessage(Message msg, Role role){
        if(role == ROLE){
            this.handleMessage(msg);
        } else if(succesor != null){
            succesor.sendMessage(msg, role);
        }
     }
    
     abstract void handleMessage(msg);
    }
    

    你比这样一个具体的处理程序:

    class RoleAHandler extends Handler{
    
       RoleAHandler(Handler succesor){
            super(succesor, RoleA);
       }
    
       @override
       void handleMessage(msg){
            // put handlecode here
       }
    }
    

    并像这样使用它:

    // initialize
    Handler handler = new RoleAHandler(null);
    handler = new RoleBHandler(handler);
    
    // usage
    handler.sendMessage(new Message, RoleA);
    

    您可以制作任意数量的角色

    【讨论】:

    • 我不认为 CoR 是正确的模式。引用 GoF:“避免将请求的发送者与其接收者耦合,让多个对象有机会处理请求。链接接收对象并沿链传递请求,直到对象处理它。”虽然您可以以在对象处理消息后不会停止的方式实现它,但我认为这更适合简单的复合模式和一些策略。
    猜你喜欢
    • 2015-08-12
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多