2013-07-20 69 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(); 
    } 
}