【问题标题】:Dynamically instantiating linked object chain动态实例化链接对象链
【发布时间】:2022-01-16 02:52:24
【问题描述】:

我正在为子字符串搜索实现一系列命令模式。我可以通过编写如下内容来静态创建链:

matchChain = new CharMatcher( new DotMatcher( new CharMatcher(null)));

我明确声明字符串中的每个字符将与模式字符句点字符("c.c")匹配

但我的目标是为任何给定的键模式动态创建此链。例如("\`\`cccc.cc\`\`*c") 将是:

matchChain = new CharMatcher( new CharMatcher( new CharMatcher( new CharMatcher( new CharMatcher(new DotMatcher( new CharMatcher( new CharMatcher( new StarMatcher( new CharMatcher(null)))))));

所以 Chain 类是一个抽象类,每个匹配器类都扩展了 Chain。

那么我怎样才能根据给定键/模式的长度动态实例化一个链呢?

【问题讨论】:

  • 您需要为此手动编写代码。

标签: java object design-patterns abstract-class instantiation


【解决方案1】:

考虑一个构建器方法(1)

public class ChainBuilder {

    private static final char DOT ='.', STAR = '*';

    public static void main(String[] args) {

        String pattern = "cccc.cc*c";
        Chain chain = chainBuilder(pattern);

        //printout chain structure
        String space ="", step =" ";
        while (true){
            if(chain == null){
                System.out.println(space + chain);
                break;
            }
            System.out.println(space + chain.getClass().getSimpleName());
            space += step;
            chain = chain.getNextLink();
        }
    }

    private static Chain chainBuilder(String pattern){

        Chain chain = null;
        String reversePattern = new StringBuilder(pattern).reverse().toString();
        for(char c : reversePattern.toCharArray()){

            switch (c) {
            case DOT:
                chain = new DotMatcher(chain);
                break;
            case STAR:
                chain = new StarMatcher(chain);
                break;
            default:
                chain = new CharMatcher(chain);
                break;
            }
        }
        return chain;
    }
}


class Chain {

    private final Chain nextLink;

    public Chain(Chain nextLink) {
        this.nextLink = nextLink;
    }

    public Chain getNextLink() {
        return nextLink;
    }
}

class CharMatcher extends Chain{

    public CharMatcher(Chain nextLink) {
        super(nextLink);
    }
}

class DotMatcher extends Chain{

    public DotMatcher(Chain nextLink) {
        super(nextLink);
    }
}

class StarMatcher extends Chain{

    public StarMatcher(Chain nextLink) {
        super(nextLink);
    }
}

(1) 发布的代码是mre。将整个代码复制粘贴到ChainBuilder.java 并运行。

【讨论】:

  • 谢谢,这正是我一直想弄清楚的。
  • 不客气。递归实现也是可能的。
  • 如果不满足条件,打破链条的正确方法是什么。前任。如果我们有模式“ABC.DEF”。和字符串 ACXYZ。所以 A 和 B 存在,但 C 不存在,所以我们想打破链/搜索并返回错误。
  • 这个问题是关于创建链的。你问的是一个完全不同的问题,关于使用链条。我不确定我是否了解它的使用方式。请提出一个新问题并在这里给我留言。我建议发布一个显示您如何使用它的 mre。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多