Design patterns 这是一种战略模式吗

Design patterns 这是一种战略模式吗,design-patterns,strategy-pattern,Design Patterns,Strategy Pattern,我是java新手,学习设计模式。我已经实现了一个简单的用例。 一个邮件服务,我想用不同的格式表示邮件。 1) 普通的2)XML 3)HTMl。我已经编写了以下代码 服务-- 服务实现-- } 消息接口--- 留言-- EMessage Cals有一个具有静态构建器模式的构造函数,我不会发布这个 public class EMessage implements Message { protected String to; protected String body; protected Stri

我是java新手,学习设计模式。我已经实现了一个简单的用例。 一个邮件服务,我想用不同的格式表示邮件。 1) 普通的2)XML 3)HTMl。我已经编写了以下代码

服务--

服务实现--

}

消息接口---

留言-- EMessage Cals有一个具有静态构建器模式的构造函数,我不会发布这个

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

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

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


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

您最好给我们展示一个UML图,而不是java代码……好吧,那么您是说仅仅覆盖“toString()”不是好的策略。比如说,我将添加一个抽象方法“formatMessage()”,子类可以实现它,我们可以从抽象MessageStrategy的toString()返回这个字符串。这是否是战略的良好实施?这样我们就可以说我们把责任交给了子类。我不是那个意思。我的意思是,即使不创建MessageStrategy类,也可以实现toString。通常,应该有一个策略方法“指定”改变的行为。然后子类可以提供自己的行为实现。在您的代码中,这恰好是toString,它基本上不需要MessageStrategy类就可以使用。因此,MessageStrategy并没有真正增加任何价值。它不包含任何可以由子类以不同方式实现的行为。
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();
}
public abstract class MessageStrategy extends EMessage{

protected Message message;

public MessageStrategy(Message message){
    this.message = message;
}
}
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();
}
 }
  @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();
}