Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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
Java 针对不同令牌的设计_Java_Oop_Design Patterns - Fatal编程技术网

Java 针对不同令牌的设计

Java 针对不同令牌的设计,java,oop,design-patterns,Java,Oop,Design Patterns,在我的应用程序中,我有代币。这些代币始终包含在[]中 令牌具有内部和外部表示,例如变量的内部表示:[x]和外部表示:[var=x] 我需要经常检查字符串中的令牌,所以我猜如果有某种方法返回该字符串中的令牌数组,将会非常有用 为此,我考虑了两种方法: 拥有一个接口或抽象类标记,并为每个标记构建子类。好处是能够为每个不同的标记实现getInternalRepresentation()和getExternalRepresentation()等方法缺点是:由于不同的令牌可能出现在同一个字符串中,并且不是

在我的应用程序中,我有代币。这些代币始终包含在[]中
令牌具有内部和外部表示,例如变量的内部表示:[x]和外部表示:[var=x]

我需要经常检查字符串中的令牌,所以我猜如果有某种方法返回该字符串中的令牌数组,将会非常有用

为此,我考虑了两种方法:

  • 拥有一个接口或抽象类标记,并为每个标记构建子类。
    好处是能够为每个不同的标记实现getInternalRepresentation()和getExternalRepresentation()等方法
    缺点是:由于不同的令牌可能出现在同一个字符串中,并且不是每次都应该处理每个令牌,因此我需要多次调用instanceof lot来检查该令牌是否是我希望在该点处理的令牌
  • 我创建了一个枚举令牌类型和一个具有此令牌类型的类令牌。令牌包含getInternalRepresentation()和getExternalRepresentation()方法,这些方法根据令牌类型返回字符串
    好处是我不必调用instanceof,因为我只需检查令牌类型即可
    缺点是,我有两个大方法,需要处理每种类型的枚举,每次调整枚举时都需要进行调整。(随着新代币的出现,可能会出现这种情况)

  • 我还考虑将这两种方法结合起来,这样我就有了一个抽象类令牌和一个最终的令牌类型字段,该字段在构造函数内部设置。然后我可以对getInternalRepresentation()和getExternalRepresentation()使用多态性,并通过TokenType字段询问令牌的类型。
    哪种方法最好?还是我遗漏了什么

    为了避免对不同类型的元素集合调用
    instanceof
    ,您可以使用visitor模式。

    您可以创建一个接口,也可以对令牌使用factory方法

    公共类令牌工厂{

    public IToken getToken(String type) {
    
        IToken token = null;
    
        if (type.equals("internal")) {
            token = new InternalToken();
        }
    
        if (type.equals("external")) {
            token = new ExternalToken();
        }
    
        return token;
    }
    
    }

    公共接口IToken{

    public void getTokenReprestation(); // your method & return type what u want
    
    }

    公共类InternalToken实现了IToken{

    /* (non-Javadoc)
     * @see com.example.IToken#getTokenReprestation()
     */
    @Override
    public void getTokenReprestation() {
        // TODO Auto-generated method stub
        System.out.println("this is Internal Token Type Object");
    }
    
    /* (non-Javadoc)
     * @see com.example.IToken#getTokenReprestation()
     */
    @Override
    public void getTokenReprestation() {
        // TODO Auto-generated method stub
        System.out.println("this is External Token Type Object");
    }
    
    }

    公共类ExternalToken实现IToken{

    /* (non-Javadoc)
     * @see com.example.IToken#getTokenReprestation()
     */
    @Override
    public void getTokenReprestation() {
        // TODO Auto-generated method stub
        System.out.println("this is Internal Token Type Object");
    }
    
    /* (non-Javadoc)
     * @see com.example.IToken#getTokenReprestation()
     */
    @Override
    public void getTokenReprestation() {
        // TODO Auto-generated method stub
        System.out.println("this is External Token Type Object");
    }
    
    }


    //只是一个演示示例,供您理解。希望它能帮助你。谢谢:)

    这里的上下文是什么?您的输入字符串是结构化语法吗?如果是这样的话,可能需要根据语法解析字符串,然后根据某些标记进行操作。不,这是带有标记的自由文本。它是用户输入,例如文本字段内的变量标记。比如2*[a]+[b],但总体环境是什么?这感觉有点像,你看,所以我想知道是否有一个更广泛的解决方案是适用的。