我有一个关于设计模式的非常愚蠢的问题:假设我们有两个类 Post
和 Product
,对于它们中的每一个,我们在数据库中都有不同的表,并且它们彼此没有任何共同点,所以我们不能为它们创建基类。一些帖子
甚至包含产品
。以下是我们应该如何处理它们:
- 以某种方式将
Post
和Product
实例存储在数据库中,当用户从下一个项目请求新闻提要时,将它们打包在一个数组中(如果重要,使用 C++),发送给客户端,客户端接收解包(使用Java)。 - 接下来,我们必须在一个列表中同时显示
Post
和Product
(例如Facebook 上的新闻提要)。< - 此外,我们可以通过聊天与 friend 分享
Post
或Product
。所以我们可以发送Post
或Product
作为消息的附件(因此,我们应该存储发送的Post
或Product 的 id
在服务器端数据库中messages
表的attached_item
列中。
那么,哪种设计模式在这里最好?我应该如何实现 Post
和 Product
类?
最佳答案
这是一个非常宽泛的问题,但这里是您可以提供的框架,只是为了给您一些想法:
// An interface containing methods specific to objects you can list
interface Listable {}
// An interface containing methods specific to objects you can share
interface Shareable {}
// An interface containing methods specific to objects you can send
interface Sendable {}
class Post implements Listable, Shareable, Sendable {
List<Product> products;
}
class Product implements Listable, Shareable, Sendable {
}
class ListManager {
public void addToList(Listable element) { }
}
class ShareManager {
public void share(Shareable element) { }
}
class SendManager {
public void send(Sendable element) { }
}
然后您可以这样交替使用 Post
和 Product
:
Post post = new Post();
Product product = new Product();
ListManager listManager = new ListManager();
listManager.addToList(post);
listManager.addToList(product);
ShareManager shareManager = new ShareManager();
shareManager.share(post);
shareManager.share(product);
SendManager sendManager = new SendManager();
sendManager.send(post);
sendManager.send(product);
关于数据库表示,正如 fusiled
在他的评论中所建议的,只需将它们放在 2 个单独的表中。在两者之间使用映射表将产品链接到他们的帖子。
编辑 关于 MESSAGES 表的问题
您可以添加一个新的映射表 MESSAGE_ATTACHED_ITEM,其中包含列 messageId
、postId
、productId
。仅在将项目附加到消息时为相关列设置值
或者另一种选择是拥有一个仅包含 ID 的 ATTACHED_ITEM 表。 并让 Post 和 Product 表具有指向该表 ID 的外键。 然后您可以将此 attachedItemId 粘贴到您的 attached_item 列中
关于database - 将两个完全不同的类作为一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49809873/