Design patterns 我如何编写一个名称中不涉及方法逻辑,但又能容纳各种算法(Java)的方法?
我正在编写一个Java应用程序,它必须通过一个安全的shell通道与一个接受自己的语言(由一系列字节组成)的设备通信 为了简单起见,此设备上有命名的读/写字段Design patterns 我如何编写一个名称中不涉及方法逻辑,但又能容纳各种算法(Java)的方法?,design-patterns,methods,interface,Design Patterns,Methods,Interface,我正在编写一个Java应用程序,它必须通过一个安全的shell通道与一个接受自己的语言(由一系列字节组成)的设备通信 为了简单起见,此设备上有命名的读/写字段 fieldAlpha fieldBeta fieldn 我可以在此设备上获取和设置 命令序列是从StringBuilder对象创建的,该对象由 前缀 可选设定器有效负载(用于设定器) 后缀 命令序列类似于ABC*somerandomvalueDEF 在写了20篇文章之后,我想一定有一种更易于维护的方法来处理这个问题 public S
fieldAlpha
fieldBeta
fieldn
- 前缀
- 可选设定器有效负载(用于设定器)
- 后缀
public String getFieldAlpha() {
StringBuilder sb = new StringBuilder();
sb.append((char) 0x1B).append("ABC").append("DEF").append((char) 0x0D);
byte[] command = sb.toString().getBytes();
String response = (sendMessage(command));
return response;
}
public String setFieldAlpha(String alpha) {
StringBuilder sb = new StringBuilder();
sb.append((char) 0x1B).append("ABC*").append(alpha).append("DEF").append((char) 0x0D);
byte[] command = sb.toString().getBytes();
String response = (sendMessage(command));
return response;
}
public String getFieldBeta() {
StringBuilder sb = new StringBuilder();
sb.append((char) 0x1B).append("OPQ").append("RST").append((char) 0x0D);
byte[] command = sb.toString().getBytes();
String response = (sendMessage(command));
return response;
}
public String setFieldBeta(String beta) {
StringBuilder sb = new StringBuilder();
sb.append((char) 0x1B).append("OPQ*").append(beta).append("RST").append((char) 0x0D);
byte[] command = sb.toString().getBytes();
String response = (sendMessage(command));
return response;
}
// ... and so forth
我认为更好的API设计应该是两种基于参数选择函数的方法。命令序列随字段的不同而变化,这一事实让我很困惑
getField()
setField(方法字段名、字符串值)
还是有更好的方法我不去想?我可能会使用Enum对象来设置字段命令序列的前缀和后缀。实现这一点的一种方法是使用将字段映射为消息格式的HashMap。如果获取字段和设置字段的格式不同,则需要两个HashMaps 应用程序必须为每个字段调用方法,因此可以添加两个方法:setField(stringfieldname,stringfieldvalue)和getField(stringfieldname) 您可以添加一个包含字段的静态类
public class Fields {
public final string Alpha = "Alpha";
public final string Alpha = "Beta";
// ......
}
添加工厂以将创建消息的责任与特殊对象分开:
public class MessageFactory {
private HashMap<string, string> mFieldNameMessageFormatMap;
public MessageFactory() {
mFieldNameMessageFormatMap = HashMap<string, string>();
// Initialize your formats here. These are just for example and are not
correct
mFieldNameMessageFormatMap.put(Fields.Alpha, "<ESC>ABC*%sDEF<LF>");
mFieldNameMessageFormatMap.put(Fields.Beta, "<ESC>OPQ*%sRST<LF>");
}
public string createGetFielMessage(string fieldName) {
return String.format(mFieldNameMessageFormatMap.get(fieldName), "");
}
public void createSetFieldMessage(string fieldName, string value) {
return String.format(mFieldNameMessageFormatMap.get(fieldName), value);
}
}
添加新字段很容易。您只需将字段添加到字段类,并将格式添加到工厂
这样,您就不必为每个字段编写方法,代码中也不会有“神奇字符串”。我明白了,对不起。。。你说你正在设计应用程序和设备之间的接口,所以我假设你也在定义格式。我将删除我答案的这一部分。另一部分是相同的。HashMap应该能够将一个字段映射到一种特殊的格式。回答得好。正是我想要的:将字符串格式化程序与能够生成消息的类相结合。谢谢,我很高兴能帮上忙。:)我可能是越狱了。我意识到你的回答实际上并不能解决问题。每个字段都有两种不同的消息格式,具体取决于是设置字段还是从设备获取字段。例如,字段ALPHA在设置时使用前缀ABC*,在获取时使用前缀ABC。但这在某些情况下是不一致的。它可能是ABC*和XUQ。如果您有不同的格式,您可以使用2个哈希映射。一个用于getValue,一个用于setValue,此代码在工厂中仍然是隔离的
public void getValue(string fieldName) {
return sendMessage(mMessageFactory.createGetFieldValue(fieldName));
}
public void setValue(string fieldName, string value) {
return sendMessage(mMessageFactory.createSetFieldValue(fieldName), value);
}
// usage:
string fieldValue = getValue(Fields.Alpha);
setValue(Fields.Alpha);