比如说,我正在用用户界面制作一个游戏,我想让某些人在画布上画出来,比如说,用上面的矩形来表示他们,一个文本框,上面写着这个人的名字。纯粹从领域的角度来看,我的人有一个名字。如果需要,可以在以后添加特定的域-逻辑。
public class Person{
private String name;
//Constructor and methods
}我还需要跟踪有关这个人的Ui信息,所以我决定创建一个独立的类来完成这个任务。
public Class PersonUi {
private int x;
private int y;
private int length;
private int width;
//Constructor and methods
}现在,我在不同的类中拥有Ui和域数据。比如说,当我点击某个人时,我想知道这个人的名字。我可以链接正确的PersonUi对象,但是我如何知道这个人的名字?如何以面向对象的方式链接Ui和域数据?
下面的选项是如何考虑良好的面向对象设计的?
1)在另一个类中保存列表,并使用列表的顺序来知道哪个ui对象属于哪个域对象
2)使用Map映射这两个类
3)使用包装类对这两个类进行包装。
或者只在一个类中定义上一个示例中的所有数据可以吗?
发布于 2017-03-20 06:03:16
通常,通过在UI和域之间设置一个服务/api层来解决这个问题。您可以将您的person ID (例如GUID)存储在personUI中。然后,在UI类中,您可以拥有:
public class PersonUi
{
private Guid personId; // Or UUID for java
private IPersonService personService;
...
nameTextBox.text = personService.getPersonName(personId);
}这样,您就不会从UI端直接链接到您的域。所有用例都必须通过服务引导。
当然,也可以使用此服务来更改域。
为了测试设计的完整性,您可以将域放在不同的包/项目中,并将其作为UI层的依赖项完全删除。UI层可以引用可以引用域层的服务层。
要将对域所做的更改传递给UI,您可能需要查看事件系统。如果一个输入组件接收到更改域的输入,并且这些更改必须传播到其他几个UI组件,那么事件可能是最好的方法。只需确保在事件args中提供最小数量的信息,而不是实际的域实体,因为这将使您回到您最初关心的UI和域耦合问题。
UI组件的最终代码可能如下所示(请原谅我肮脏的C#约定):
public class PersonUi implements IPersonNameChangeListener
{
private Guid personId; // Or UUID for java
private IPersonService personService;
...
public void userEnteredANewNameThroughUI(String newName)
{
personService.setName(personId, newName);
}
@Override
public void onPersonNameChange(Guid personId, String newName)
{
if(this.personId != personId)
return;
nameTextBox.text = newName;
}
}在最后一个代码示例中,您将注意到输入不会直接影响输出。相反,更改会冒泡到您的域,并通过事件返回到您的UI层。这意味着您的输入和输出组件现在也是独立的。
https://stackoverflow.com/questions/42881351
复制相似问题