gpt4 book ai didi

java - 优雅的对象层次结构

转载 作者:行者123 更新时间:2023-12-02 07:47:43 25 4
gpt4 key购买 nike

首先,请原谅我的伪代码,我认为在这种情况下它比完整的代码更清晰。请假设伪代码中的属性实际上是具有 getter 和 setter 方法的字段,但 ArticleElement 除外,它只需要是可通过直接 getter 方法从对象访问的属性,或两步 getter 方法(即 getArticleSource().getName())。

假设我有一个模板实体:

ArticleTemplate
Long id;
String name;
String description;
Integer amount;
Schedule schedule;

并且它用于(通过其时间表)在不同的日期创建许多潜在的子实体:

Article
Long id;
String name;
String description;
Integer amount;
Date date;
Boolean complete;
ArticleTemplate template;

一些子实体不是从父实体创建的,它们可以是独立的(模板可以为空)。

对于我的用户界面,我想创建一个排序和合并的列表:
a) 来自父实体的潜在子实体
b) 先前从父实体创建的真实子实体
c) 独立创建的孤儿实体

但是,我需要向此列表的元素添加一些属性来确定元素之间的差异:

ArticleElement
// actual value if from Article, null if from potential from ArticleTemplate
Long id;
// actual value if from Article or ArticleTemplate
String name;
// actual value if from Article or ArticleTemplate
String description;
// actual value if from Article or ArticleTemplate
Integer amount;
// actual value if from Article, simulated if from potential from ArticleTemplate
Date date;
// actual value if from Article, false if from potential from ArticleTemplate
Boolean complete;
// actual value (nullable) if from Article, self if from potential from ArticleTemplate
ArticleTemplate template;
// false if from Article, true if from potential from ArticleTemplate
Boolean templateSimulation;
// once the list is sorted, a running tally of this.amount is to be stored on this object
Integer runningTally;
// would be type of interface if Article and ArticleTemplate implement same
Object source;

显然我将至少有 3 个类,但是有一些不同的接口(interface)方法等。

我希望尽可能避免克隆和属性复制,并在有利的情况下使用继承。

感谢建议!

最佳答案

这是我当前的解决方案,我不确定我是否喜欢它,但我还没有想出更好的解决方案:

首先,我将保留 Article 和 ArticleTemplate。我可以让他们实现一个接口(interface)来描述他们的相似之处,但这并没有给这种情况带来太多好处。

创建 UI 合约

public interface UiElement<T>
{
T getSource();
Class<T> getType();
// redundant - refer to source
// Long getId();
String getName();
String getDescription();
Integer getAmount();
Date getDate();
Boolean getComplete();
// redundant - not needed anymore
// ArticleTemplate getTemplate();
// redundant - replaced by getType()
// Boolean getTemplateSimulation();
Integer getRunningTally();
}

为文章创建实现 - 通过对大多数属性的源对象的契约调用

public class ArticleUiElement implements UiElement<Article>
{
private Article source;
private Integer tally;

public ArticleUiElement(Article source) {
this.source = source;
}

public Article getSource() {
return source;
}

public Class<Article> getType() {
return Article.class;
}

public String getName() {
return source.getName();
}

public String getDescription() {
return source.getDescription();
}

public Integer getAmount() {
return source.getAmount();
}

public Date getDate() {
return source.getDate();
}

public Boolean getComplete() {
return source.getComplete();
}

public String getRunningTally() {
return tally;
}

public void setRunningTally(String tally) {
this.tally = tally;
}
}

创建 ArticleTemplate 的实现 - 通过对大多数属性的源对象的契约调用

public class ArticleTemplateUiElement implements UiElement<ArticleTemplate>
{
private ArticleTemplate source;
private Integer tally;
private Date date;

public ArticleTemplateUiElement(ArticleTemplate source) {
this.source = source;
}

public ArticleTemplate getSource() {
return source;
}

public Class<ArticleTemplate> getType() {
return ArticleTemplate.class;
}

public String getName() {
return source.getName();
}

public String getDescription() {
return source.getDescription();
}

public Integer getAmount() {
return source.getAmount();
}

public Date getDate() {
return date;
}

public void setDate(Date date) {
this.date = date;
}

public Boolean getComplete() {
return false;
}

public String getRunningTally() {
return tally;
}

public void setRunningTally(String tally) {
this.tally = tally;
}
}

有人可以提供改进或完全更好的解决方案吗?

关于java - 优雅的对象层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4255710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com