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 类有一个带有静态生成器模式的构造函数,我没有发布它。

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("toSomeone@gmail.com").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();
}

现在我想知道我可以将其称为策略模式吗?

4

1 回答 1

0

策略/策略模式是可以根据运行时实例选择行为的地方。所以这是一种行为模式。并且行为会根据实例而变化。

现在这里要问的问题是 - 这里正在改变什么行为。您似乎只在类中实现了 toString() 方法。您的对象将对 toString() 调用做出不同的响应。所以理论上 toString 是一种策略方法。但这似乎在这里发生了很多。没有额外的策略来区分 MessageStrategy 的两个子类。如果 MessageStrategy 没有提到任何应该由不同的子类以不同方式实现的策略,那么创建 MessageStrategy 是没有用的。

于 2013-10-29T12:30:00.667 回答