2013-10-29 2 views
0

저는 자바를 처음 사용하고 디자인 패턴을 배우는 사람입니다. 나는 간단한 유스 케이스를 구현했다. 다른 형식으로 메일을 나타내고 싶은 메일 서비스. 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 - T 그는 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(); 
} 

메시지 전략 - 은 toString() 메서드는 다음과 같습니다 만의 toString 구현이 다른, 그리고 -

public abstract class MessageStrategy extends EMessage{ 

protected Message message; 

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

XMLMessage은 ... MessageStrategy가 메시지 인터페이스를 EMessage 연장되지 않고 있습니다 내 인터페이스에는 없습니다.

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

Java 코드 대신 UML 다이어그램을 표시하는 것이 좋습니다. –

답변

0

전략/정책 패턴은 런타임 인스턴스를 기준으로 동작을 선택할 수있는 곳입니다. 그래서 행동 패턴입니다. 그리고 동작은 인스턴스마다 변경됩니다.

여기에서 묻는 질문은 여기에서 어떤 동작이 변경되는지입니다. 클래스에서 toString() 메서드 만 구현하는 것 같습니다. 객체는 toString() 호출과 다르게 응답합니다. 그래서 이론적으로 toString은 전략적 방법입니다. 그러나 그것은 여기에서 꽤 많이 일어나는 것처럼 보입니다. MessageStrategy의 두 하위 클래스를 구별하는 추가 정책은 없습니다. 다른 하위 클래스에 따라 다르게 구현해야하는 전략이 없다면 MessageStrategy를 만드는 용도로는 사용하지 않습니다.

+0

"이제 toString()"을 재정의하는 것이 좋은 전략이 아닙니다. 말하자면, 서브 클래스가 구현할 수있는 추상 메소드 "formatMessage()"를 추가하고 추상 MessageStrategy의 toString()에서이 문자열을 반환 할 수 있습니다. 그것은 전략을위한 좋은 구현일까요? 이렇게하면 하위 클래스에 책임을 부여한다고 말할 수 있습니다. –

+0

나는 그것을 의미하지는 않았다. MessageStrategy 클래스를 만들지 않고도 toString을 구현할 수 있다는 의미였습니다. 일반적으로 '변경하는 행동'을 '지정'하는 정책 방법이 있어야합니다. 그런 다음 하위 클래스는 해당 동작을 구현할 수 있습니다. 귀하의 코드에서 이것은 MessageStrategy 클래스없이 기본적으로 사용할 수있는 toString입니다. 따라서 MessageStrategy는 실제로 어떠한 가치도 추가하지 않습니다. 서브 클래스에 의해 다르게 구현 될 수있는 어떤 행위도 포함하지 않습니다. – Atul