假设您将所有数据存储在一个类中,例如KittenStorage
. 然后你有一个班级想要找到一只特定颜色的小猫,可能叫做KittenFinder
. 显然,您已经设计了面向对象的程序来分离这两个截然不同的类,但现在KittenFinder
需要直接与KittenStorage
. 你如何连接这两个不同的类?
4 回答
您需要使用图层。首先,您需要一个数据访问层。该层将包含支持直接数据存储命令的类。接下来,您需要一个业务层。该层执行您的业务逻辑中需要执行的任何操作。该层将通过数据访问层使用数据存储。或者,您可以创建一个引擎层,其中可能会实现一些更复杂的算法,它将通过业务层与数据存储进行通信。最后,您拥有 UI,它将通过引擎层或业务层与您的数据存储进行通信。在现实生活中,您的存储是一个数据库,您的数据访问层与数据库进行通信。我希望这可以帮到你。
让我们稍微改进一下您的示例 - 假设 KittenStorage 以 storage.get(0) 或 storage[0] 的形式为您提供对小猫的索引访问,并且它还有一个计数或大小属性来知道它有多少只小猫商店。这种方式可以实现 KittenFinder 进行前向搜索,即
for (int i = 0; i < storege.size; i++)
{
//return kitten if matches
}
或者它可以做一个BinarySearch
KittenStorage 类也可能包含持久性机制(例如将小猫保存到数据库或文件)。也许它可以包含一个持久化策略 - 一个不同的类,以便可以交换持久性机制。
这被称为关注点分离 - 一个类应该只做一件事并且只能以一种方式 - 这样很容易维护代码。
取决于,有些人会在返回小猫的 KittenStorage 上放置一个 Find 方法。
假设 KittenStorage 是 Kittens 的商店,而 KittenFinder 是 KittenStorage 中 Kitten 或 Kitten(s) 的 Finder
而且那个 Kitten 是一个可存储和可查找的项目,它也有一些行为,例如 Scratch,这与它的可存储和可查找无关,然后 Kitten 将通过 IStorable 链接到 KittenStorage,并且通过 IFindable 将 KittenFinder 链接到 KittenStorage
拥有 DTO(数据传输对象)也是有充分理由的。这只是小猫的状态,即你找到和存储的不是小猫的那个划痕
基本上,以上所有内容都是假设还有 PuppyStorage 和 PuppyFinder 等,并且您希望尽可能地解耦。
一般来说,KittenFinder 对 KittenStorage 有“依赖关系”。您的问题是如何设置(注入)此依赖项。这取决于您选择的应用程序框架。Spring 框架是一种流行的方法。