0

假设您将所有数据存储在一个类中,例如KittenStorage. 然后你有一个班级想要找到一只特定颜色的小猫,可能叫做KittenFinder. 显然,您已经设计了面向对象的程序来分离这两个截然不同的类,但现在KittenFinder需要直接与KittenStorage. 你如何连接这两个不同的类?

4

4 回答 4

1

您需要使用图层。首先,您需要一个数据访问层。该层将包含支持直接数据存储命令的类。接下来,您需要一个业务层。该层执行您的业务逻辑中需要执行的任何操作。该层将通过数据访问层使用数据存储。或者,您可以创建一个引擎层,其中可能会实现一些更复杂的算法,它将通过业务层与数据存储进行通信。最后,您拥有 UI,它将通过引擎层或业务层与您的数据存储进行通信。在现实生活中,您的存储是一个数据库,您的数据访问层与数据库进行通信。我希望这可以帮到你。

于 2012-10-05T14:13:03.607 回答
0

让我们稍微改进一下您的示例 - 假设 KittenStorage 以 storage.get(0) 或 storage[0] 的形式为您提供对小猫的索引访问,并且它还有一个计数或大小属性来知道它有多少只小猫商店。这种方式可以实现 KittenFinder 进行前向搜索,即

for (int i = 0; i < storege.size; i++)
{
     //return kitten if matches
}

或者它可以做一个BinarySearch

KittenStorage 类也可能包含持久性机制(例如将小猫保存到数据库或文件)。也许它可以包含一个持久化策略 - 一个不同的类,以便可以交换持久性机制。

这被称为关注点分离 - 一个类应该只做一件事并且只能以一种方式 - 这样很容易维护代码。

于 2012-10-05T13:58:19.693 回答
0

取决于,有些人会在返回小猫的 KittenStorage 上放置一个 Find 方法。

假设 KittenStorage 是 Kittens 的商店,而 KittenFinder 是 KittenStorage 中 Kitten 或 Kitten(s) 的 Finder

而且那个 Kitten 是一个可存储和可查找的项目,它也有一些行为,例如 Scratch,这与它的可存储和可查找无关,然后 Kitten 将通过 IStorable 链接到 KittenStorage,并且通过 IFindable 将 KittenFinder 链接到 KittenStorage

拥有 DTO(数据传输对象)也是有充分理由的。这只是小猫的状态,即你找到和存储的不是小猫的那个划痕

基本上,以上所有内容都是假设还有 PuppyStorage 和 PuppyFinder 等,并且您希望尽可能地解耦。

于 2012-10-05T16:30:11.487 回答
0

一般来说,KittenFinder 对 KittenStorage 有“依赖关系”。您的问题是如何设置(注入)此依赖项。这取决于您选择的应用程序框架。Spring 框架是一种流行的方法。

于 2012-10-07T07:34:50.667 回答