2013-07-20 42 views
0

我需要实现基于角色的消息发送功能。哪种设计模式可用于灵活的邮件发送?

  • 角色一个:消息只能由被发送的电子邮件
  • 角色C::消息只能由SMS
  • 角色d被发送:消息消息应该由电子邮件和SMS
  • 角色乙发送应该通过推特发送

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

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

我应该考虑采用哪些设计模式来实现它?

+0

除了实现IMessageChannel的三个类之外,还需要创建一个具体类MultiChannel,它使用Composite模式,以便可以将多个MessageChannel放入类中并将它们视为一个类。然后,您的工厂可以根据角色规则将电子邮件,短信和Twitter MessageChannel推送到MultiChannel中,并将其传递给正在使用的客户端。 – Gordon

回答

1

它看起来像你需要的“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); 

你可以使尽可能多的角色,你想要

+0

我试图避免如果其他... –

+0

我编辑了示例 –

+1

我不认为CoR在这里是正确的模式。引用GoF:“通过给予多个对象一个处理请求的机会,避免将请求的发送者耦合到接收者。链接接收对象并沿着链传递请求,直到对象处理它为止。”虽然你可以用一种不会在对象处理完消息后停止的方式来实现它,但我认为这更适合于一个简单的复合模式和一些策略。 – Gordon

2
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(); 
    } 
}