2013-10-29 96 views
0

我是新來的java和學習設計模式。我已經實現了一個簡單的用例。 一個郵件服務,我想用不同的格式表示郵件。 1)普通2)XML 3)HTMl。我寫了下面的代碼。這是一個戰略模式

服務 -

public interface GmailService { 
public void sendMessage(); 
} 

服務實現 -

public class GmailServiceImpl implements GmailService { 

private Message message; 

public GmailServiceImpl(Message message){ 
    this.message = message; 
} 

@Override 
public void sendMessage(){ 
    System.out.println(this.message); 
} 

}

消息接口---

public interface Message { 
public String getBody(); 
public String getSubject(); 
public String getTo(); 
} 

EMessage - Ť他EMessage calss有一個構造函數與靜態生成器模式,我不張貼。

public class EMessage implements Message { 

protected String to; 
protected String body; 
protected String subject; 

@Override 
public String getBody(){ 
    return this.body; 
} 

@Override 
public String getSubject() { 
    return this.subject; 
} 

@Override 
public String getTo() { 
    return this.to; 
} 

protected Field[] getClassFields(){ 
    return this.getClass().getDeclaredFields(); 
} 

@Override 
public String toString(){ 
    StringBuilder sb = new StringBuilder(); 
    Field[] fileds = this.getClass().getDeclaredFields(); 
    for(Field field:fileds){ 
     try { 
      sb.append(field.getName()).append(":-").append(field.get(this)).append(" "); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 
    return sb.toString(); 
} 

信息戰略 - 請注意MessageStrategy正在擴大EMessage而不是消息接口...

public abstract class MessageStrategy extends EMessage{ 

protected Message message; 

public MessageStrategy(Message message){ 
    this.message = message; 
} 
} 

XMLMessage - 只的toString實現不同的是,和toString()方法不在我的界面。

public class XMLMessage extends MessageStrategy { 

public XMLMessage(Message message) { 
    super(message); 
} 

@Override 
public String toString(){ 
    StringBuilder sb = new StringBuilder(); 
    Field[] fields = this.message.getClass().getDeclaredFields(); 
    sb.append("<class>"); 
    for(Field field:fields){ 
     try { 
      sb.append("<filed><name>").append(field.getName()).append("</name><value>").append(field.get(this.message)).append("</value><field>"); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 
    sb.append("</class>"); 
    return sb.toString(); 
} 
} 

和HTML實現一樣。 客戶端代碼 -

@Test 
public void testXmlMessageStrategy(){ 
    Message m = new EMessage.EMessageBuilder().subject("Hi There").to("[email protected]").body("How r u buddy").build(); 

    MessageStrategy xMessage = new XMLMessage(m); 
    GmailService service = new GmailServiceImpl(xMessage); 
    service.sendMessage(); 

    System.out.println(); 

    MessageStrategy htmlMessage = new HTMLMessage(m); 
    service = new GmailServiceImpl(htmlMessage); 
    service.sendMessage(); 
} 

現在我想知道我可以把這個作爲戰略格局?

+1

你最好給我們展示一個UML圖,而不是java代碼...... –

回答

0

策略/策略模式是可以根據運行時實例選擇行爲的地方。 所以這是一種行爲模式。行爲根據實例而改變。

現在要問的問題是 - 這裏改變了什麼行爲。看來你只能在你的類中實現toString()方法。您的對象將對toString()調用做出不同的響應。所以理論上toString是一種策略方法。但這似乎在這裏發生。沒有其他策略可以區分MessageStrategy的兩個子類。如果MessageStrategy沒有提及任何應該由不同子類實現的策略,那麼創建MessageStrategy就沒有用處。

+0

好吧,所以你只是說重寫「toString()」並不是好策略。比方說,我將添加一個抽象方法「formatMessage()」,該類可以實現,我們可以從抽象MessageStrategy的toString()返回這個字符串。這是一個很好的策略實施嗎?這樣我們可以說我們將責任交給子類。 –

+0

我不是那個意思。我的意思是即使沒有創建MessageStrategy類,你也可以實現toString。一般而言,應該有一種「指定」「改變的行爲」的政策方法。然後子類可以提供他們自己的這種行爲的實現。在你的代碼中,這恰好是沒有MessageStrategy類的基本上可用的toString。所以MessageStrategy並沒有真正增加任何價值。它不包含任何可以通過子類實現的行爲。 – Atul