Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 我如何编写一个名称中不涉及方法逻辑,但又能容纳各种算法(Java)的方法?_Design Patterns_Methods_Interface - Fatal编程技术网

Design patterns 我如何编写一个名称中不涉及方法逻辑,但又能容纳各种算法(Java)的方法?

Design patterns 我如何编写一个名称中不涉及方法逻辑,但又能容纳各种算法(Java)的方法?,design-patterns,methods,interface,Design Patterns,Methods,Interface,我正在编写一个Java应用程序,它必须通过一个安全的shell通道与一个接受自己的语言(由一系列字节组成)的设备通信 为了简单起见,此设备上有命名的读/写字段 fieldAlpha fieldBeta fieldn 我可以在此设备上获取和设置 命令序列是从StringBuilder对象创建的,该对象由 前缀 可选设定器有效负载(用于设定器) 后缀 命令序列类似于ABC*somerandomvalueDEF 在写了20篇文章之后,我想一定有一种更易于维护的方法来处理这个问题 public S

我正在编写一个Java应用程序,它必须通过一个安全的shell通道与一个接受自己的语言(由一系列字节组成)的设备通信

为了简单起见,此设备上有命名的读/写字段

  • fieldAlpha
  • fieldBeta
  • fieldn
  • 我可以在此设备上获取设置

    命令序列是从StringBuilder对象创建的,该对象由

    • 前缀
    • 可选设定器有效负载(用于设定器)
    • 后缀
    命令序列类似于ABC*somerandomvalueDEF

    在写了20篇文章之后,我想一定有一种更易于维护的方法来处理这个问题

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