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_Inheritance_Domain Driven Design_Adapter - Fatal编程技术网

Java 寻找关于适配器模式使用的反馈

Java 寻找关于适配器模式使用的反馈,java,design-patterns,inheritance,domain-driven-design,adapter,Java,Design Patterns,Inheritance,Domain Driven Design,Adapter,在一个正在工作的项目中,我们的域模型中有一个特定的值类型类,它包含大量的属性 public class BigValueType { private Foo foo; private Bar bar; private Baz baz; //... } 我们已经意识到,我们希望将其“集中”到一些不同的、更专业的类中,这些类只有该类属性的一些子集。我想我们希望对这些数据有不同的“看法” public class SpecializationA { priv

在一个正在工作的项目中,我们的域模型中有一个特定的值类型类,它包含大量的属性

public class BigValueType {
    private Foo foo;
    private Bar bar;
    private Baz baz;

    //...
}
我们已经意识到,我们希望将其“集中”到一些不同的、更专业的类中,这些类只有该类属性的一些子集。我想我们希望对这些数据有不同的“看法”

public class SpecializationA {
    private Foo foo;
    private Baz baz;
    //...
}

public class SpecializationB {
    private Bar bar;
    private Baz baz;
    //...
}

private class SpecializationC {
    private Foo foo;
    private Bar bar;
    //...
}
然而,这个领域模型是相当一般的,而不是特定于这个项目。在未来的项目中,它将添加特定于项目的扩展,但是公共域模型将与这些扩展分开。如果我们现在只定义一组类,那么其他使用域模型的项目很可能以后只需要编写它们自己的稍有不同的类。(我们无法轻松预测这些数据的哪些视图会有用。)

我认为我们应该做的是为这个大类编写特定于项目的适配器,以呈现数据的不同视图。这样,域的未来用户就不必接触“公共”域模型中的任何内容来定义此信息的新视图

public class AdapterA {
    private BigValueType wrapped;
    //...

    public ViewA(BigValueType wrapped) {
        //...
    }

    public Foo getFoo() {
        return wrapped.getFoo();
    }

    //...
}
这对我来说比普通继承更有意义,因为我们的顶级类/接口中几乎没有任何内容


对这种方法有什么反馈吗?

好吧。。我觉得很好。我认为您使用组合的解决方案比使用继承要好得多,它将对您的模型产生巨大影响,并生成大量低内聚类。

很好。。我觉得很好。我认为您使用组合的解决方案比使用继承要好得多,它会对您的模型产生很大影响,并生成大量低内聚类。

首先,了解您想要解决的问题很重要。拥有一个拥有大量属性的类并不一定是坏的,如果你只想按照“好”的设计原则进行重构,我会重新考虑这个决定

话虽如此,这是SOA世界中相当常见的设计。您有一个大型服务,它接受一个具有相当多属性的复杂消息作为请求。然后对该服务进行“调整”,以满足不同需求的客户。因此,您的设计应该运行良好。当然,它假定您已经知道所有可能的“视图”,或者您必须为新客户机编写新的适配器

这种“自适应”可以在两个级别上执行——用户界面级别(本质上是您的设计——以适应类)或在较低级别上执行,例如在数据库级别,这反过来也会修改您的主类。这取决于您的应用程序、框架的用户等等

另一种可考虑的方法也可以是这样做的另一种方式——暴露数据(FO、BAZ等),尽管来自主类,并且让客户端自己处理数据,主类基本上在这个数据上提供CRUD特征。然后,类的行为更像一个没有真正业务逻辑的结构


这三种方法中的任何一种都应该是可以的,IMHO。

首先,了解您想要解决的问题很重要。拥有一个拥有大量属性的类并不一定是坏的,如果你只想按照“好”的设计原则进行重构,我会重新考虑这个决定

话虽如此,这是SOA世界中相当常见的设计。您有一个大型服务,它接受一个具有相当多属性的复杂消息作为请求。然后对该服务进行“调整”,以满足不同需求的客户。因此,您的设计应该运行良好。当然,它假定您已经知道所有可能的“视图”,或者您必须为新客户机编写新的适配器

这种“自适应”可以在两个级别上执行——用户界面级别(本质上是您的设计——以适应类)或在较低级别上执行,例如在数据库级别,这反过来也会修改您的主类。这取决于您的应用程序、框架的用户等等

另一种可考虑的方法也可以是这样做的另一种方式——暴露数据(FO、BAZ等),尽管来自主类,并且让客户端自己处理数据,主类基本上在这个数据上提供CRUD特征。然后,类的行为更像一个没有真正业务逻辑的结构


这三种方法中的任何一种都应该可以,IMHO。

我发现跨多个项目共享代码的目标比听起来更难。至少,这很难做到正确!这正是您讨论的原因,您不知道在某些新项目中可能需要哪些功能。问题在于适配器问题无法为您解决这个问题(如果底层对象不支持所需的功能集,也就是说)

我建议您为单独的项目使用
接口
,但要单独编写实现代码。如果你发现自己写了3次完全相同的代码,那么把它放到一个公共库中。尽量保持库的轻量级


以后,当您发现需要添加功能时,管理多个依赖项可能会很昂贵,可能会出现冲突,并且会影响许多应用程序。我发现跨多个项目共享代码的目标比听起来更难实现。至少,这很难做到正确!这正是您讨论的原因,您不知道在某些新项目中可能需要哪些功能。问题在于适配器问题无法为您解决这个问题(如果底层对象不支持所需的功能集,也就是说)

我建议您在单独的项目中使用
接口
,但是