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
Java 我应该如何设计这段代码(并行类层次结构)?_Java_Design Patterns - Fatal编程技术网

Java 我应该如何设计这段代码(并行类层次结构)?

Java 我应该如何设计这段代码(并行类层次结构)?,java,design-patterns,Java,Design Patterns,我有一组应用程序都需要与Web服务同步: 从Web服务下载一些XML 解析该XML 然后更新数据库以匹配解析的XML 我希望将尽可能多的相关代码保存在一个公共库中,以避免重复,并且我希望不同的应用程序都将其解析和更新代码放入一个相当简单的公共框架中 所以有一个常见的sync()方法: 然后我有一个更新程序,它需要获取解析的项并将内容注入数据库: public abstract class Updater { public abstract void updateItem(ParsedAn

我有一组应用程序都需要与Web服务同步:

  • 从Web服务下载一些XML
  • 解析该XML
  • 然后更新数据库以匹配解析的XML
  • 我希望将尽可能多的相关代码保存在一个公共库中,以避免重复,并且我希望不同的应用程序都将其解析和更新代码放入一个相当简单的公共框架中

    所以有一个常见的sync()方法:

    然后我有一个更新程序,它需要获取解析的项并将内容注入数据库:

    public abstract class Updater {
        public abstract void updateItem(ParsedAnimal parsed);
    }
    public class CatUpdater extends Updater {
        @Override
        public void updateItem(ParsedCat parsed) {}
    }
    public class DogUpdater extends Updater {...}
    
    这不起作用-Updater的契约指定updateItem()接受ParsedAnimal,CatUpdater和DogUpdater都通过只接受特定类型的动物来打破契约

    我拥有的是一个并行类层次结构——ParsedX与XUpdater一一匹配。关于编码恐惧的页面建议将两个类层次结构合并到一个层次结构中,但我觉得“正在处理的事情”和“正在处理的事情”差别很大,它们应该是单独的类


    有没有一种简洁的方法来组织这个,或者一些设计模式会派上用场呢?

    泛型可以帮你解决
    更新程序
    合同的问题:

    public abstract class Updater<T extends ParsedAnimal> {
        public abstract void updateItem(T parsed);
    }
    public class CatUpdater extends Updater<ParsedCat> {
        @Override
        public void updateItem(ParsedCat parsed) {}
    }
    public class DogUpdater extends Updater<ParsedDog> {...}
    
    公共抽象类更新程序{
    公共摘要void updateItem(T解析);
    }
    公共类CatUpdater扩展更新程序{
    @凌驾
    public void updateItem(ParsedCat parsed){}
    }
    公共类DogUpdater扩展了更新程序{…}
    

    但是,您的
    sync
    方法有一个
    Updater
    作为参数,它试图用于所有解析的项。这行不通。如果要对每个解析类型使用单独的
    更新程序
    ,则需要根据解析结果实例化更新程序。这可以通过某种形式的“工厂”来处理。首先,您可能想看看如何使用该模式。

    泛型可以解决您在
    更新程序
    合同中遇到的问题:

    public abstract class Updater<T extends ParsedAnimal> {
        public abstract void updateItem(T parsed);
    }
    public class CatUpdater extends Updater<ParsedCat> {
        @Override
        public void updateItem(ParsedCat parsed) {}
    }
    public class DogUpdater extends Updater<ParsedDog> {...}
    
    公共抽象类更新程序{
    公共摘要void updateItem(T解析);
    }
    公共类CatUpdater扩展更新程序{
    @凌驾
    public void updateItem(ParsedCat parsed){}
    }
    公共类DogUpdater扩展了更新程序{…}
    

    但是,您的
    sync
    方法有一个
    Updater
    作为参数,它试图用于所有解析的项。这行不通。如果要对每个解析类型使用单独的
    更新程序
    ,则需要根据解析结果实例化更新程序。这可以通过某种形式的“工厂”来处理。首先,您可能想看看如何使用该模式。

    是的,使用泛型:
    公共抽象类更新程序{
    公共类CatUpdate扩展更新程序{
    。在更新程序中:
    公共抽象无效更新项(T解析);
    是的,使用泛型:
    公共抽象类更新程序{
    公共类CatUpdate扩展了更新程序{
    。在更新程序中:
    公共抽象void updateItem(T parsed);
    感谢堆的回答-我没有意识到我可以“硬编码”通过在扩展中指定泛型类型来实现类似的泛型。@堂·罗比:我在这里有一个澄清。您如何调用此更新程序方法?我的意思是,您可以使用更新程序的调用方方法更新您的帖子,该方法迭代解析的动物列表中的每个项目,并使用泛型调用此更新方法。@Rockstart:这基本上就是poi我关于同步方法的笔记。你需要一些东西来为每一个被解析的东西创建一个合适的
    更新程序。
    。在你如何做这件事上有一些选择。我可能(今天晚些时候)尝试提出一些示例代码并将其添加到答案中。感谢堆的答案-我没有意识到我可以“硬编码”通过在扩展中指定泛型类型来实现类似的泛型。@堂·罗比:我在这里有一个澄清。您如何调用此更新程序方法?我的意思是,您可以使用更新程序的调用方方法更新您的帖子,该方法迭代解析的动物列表中的每个项目,并使用泛型调用此更新方法。@Rockstart:这基本上就是poi我关于sync方法的注释的nt部分。您需要为解析的每件事情创建一个适当的
    更新程序
    。在如何执行此操作方面有一些选择。我可能(今天晚些时候)尝试提出一些示例代码,并将其添加到答案中。
    public abstract class Updater<T extends ParsedAnimal> {
        public abstract void updateItem(T parsed);
    }
    public class CatUpdater extends Updater<ParsedCat> {
        @Override
        public void updateItem(ParsedCat parsed) {}
    }
    public class DogUpdater extends Updater<ParsedDog> {...}
    
    updateItem(ParsedAnimal parsed){
        if (parsed instanceof ParsedCat) {
            ... 
        } else if (parsed instanceof ParsedDog) {
            ... 
        } 
    }