是否有使用DTO的模式而不必复制域对象的属性?

bit*_*yan 20 java architecture oop

我想在我的视图模型中使用DTO来代替我的域对象,但是我很难证明必须为每个域对象维护两组属性的维护开销.

我想知道是否有人已经实现或知道一个模式,其中域对象的属性与对象的操作分离,而不必维护两组属性.

我以为我的域对象只是属性并将操作作为子类附加:

public class Person{
    private String firstName;
    private String lastName;

    public String getFirstName(){
        return this.firstName;
    }

    public String setFirstName(string firstName){
        this.firstName = firstName;
    }

    ...
}

public class PersonActions extends Person{
    public void save(){
        ...
    }

    public Person get(){

    }
}
Run Code Online (Sandbox Code Playgroud)

这种方式仍然感觉有些麻烦,因为如果我想要域对象的完整表示,我必须传递一个PersonAction类.

And*_*ues 3

您可以使用仅公开对象数据的接口,而不需要任何域方法。您仍然需要维护两个类,但这会容易得多,因为大多数更改都可以由您的 IDE(例如 Eclipse)重构。这是一个例子:

public interface PersonView {
    String getFirstName();
    String setFirstName();
}

public void Person implements PersonView {
    private String firstName;

    @Override // This annotation guarantees the interface is correct 
    public String getFirstName() {
        return firstName;
    }

    ...domain methods...
}
Run Code Online (Sandbox Code Playgroud)

这不是一个完美的解决方案,但它是一个非常干净的解决方案。

至于问题本身,我并不介意将整个对象暴露给视图层。恕我直言,我认为隐藏某些方法不值得花费这些开销。团队应该有纪律来明智地使用这些对象,但这只是我的观点。