我是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有一个带有Static Builder模式的构造函数,我不会发布它。
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();
}
现在我想知道我可以将其称为策略模式吗?
答案 0 :(得分:0)
策略/策略模式是可以基于运行时实例选择行为的位置。 所以这是一种行为模式。并且行为根据实例而变化。
现在要问的问题是 - 这里改变了什么行为。您似乎只在类中实现toString()方法。您的对象将以不同的方式响应toString()调用。所以理论上toString是一种策略方法。但这似乎发生在这里。没有其他策略可以区分MessageStrategy的两个子类。如果不提及任何应该由不同子类以不同方式实现的策略,则创建MessageStrategy是没有用的。