设计不同的令牌

时间:2014-12-19 10:06:59

标签: java oop design-patterns

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

我需要经常检查Strings for Tokens,所以我猜想有一种返回此String中的Tokens数组的方法会非常有用。

为此,我想到了两种方法:

  1. 为每个令牌设置接口或抽象类令牌并构建子类。
    其好处是能够为每个不同的令牌实现getInternalRepresentation()和getExternalRepresentation()等方法。
    缺点是:由于不同的令牌可以出现在相同的字符串中,而不是每次都要处理每个令牌时,我需要调用instanceof来检查令牌是否是我想要处理的那个或者不。
  2. 我创建了一个枚举TokenType和一个具有此TokenType的类令牌。令牌包含方法getInternalRepresentation()和getExternalRepresentation(),它们返回基于TokenType的字符串。
    好处是我不必调用instanceof,因为我可以检查TokenType。
    缺点是我有两个大方法需要处理每个类型的枚举,需要调整,每次调整枚举。 (可能出现新的令牌的情况)
  3. 我还考虑过将两种方法结合起来,以便我有一个抽象类Token,最后的TokenType字段在构造函数中设置。然后我可以使用多态来获取getInternalRepresentation()和getExternalRepresentation(),并通过TokenType字段询问令牌的类型。
    哪种方法最好?还是我错过了什么?

2 个答案:

答案 0 :(得分:0)

为避免在收集具有不同类型的元素时调用instanceof,您可以使用访问者模式。

答案 1 :(得分:0)

您可以创建一个界面,&也可以使用工厂方法为您的令牌。

公共类TokenFactory {

public IToken getToken(String type) {

    IToken token = null;

    if (type.equals("internal")) {
        token = new InternalToken();
    }

    if (type.equals("external")) {
        token = new ExternalToken();
    }

    return token;
}

}

public interface IToken {

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

}

public class 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");
}

}

公共类ExternalToken实现了IToken {

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

}

public static void main(String[] args) {
    // TODO Auto-generated method stub

    TokenFactory tokenFactory = new TokenFactory();

    IToken token = tokenFactory.getToken("internal");
    token.getTokenReprestation();

    IToken token = tokenFactory.getToken("external");
    token.getTokenReprestation();

}

//只是一个演示示例供您理解。希望它会对你有所帮助。谢谢:))