Database 将两个完全不同的类作为一个类使用
关于设计模式,我有一个非常愚蠢的问题:假设我们有两个类Database 将两个完全不同的类作为一个类使用,database,oop,inheritance,design-patterns,Database,Oop,Inheritance,Design Patterns,关于设计模式,我有一个非常愚蠢的问题:假设我们有两个类Post和Product,对于它们,我们在数据库中有不同的表,它们彼此没有任何共同点,所以我们不能为它们创建基类。一些帖子甚至包含产品。下面是我们应该如何处理它们: 不知如何存储DB中的代码>代码>产品>代码>实例,当用户请求下一个项目的新闻馈送时,将它们打包在一个数组中(如果使用C++,如果需要的话),将其发送到客户端,并在客户端(使用java)接收和解包。 接下来,我们必须在one列表中显示Post和Product(例如Facebook上
Post
和Product
,对于它们,我们在数据库中有不同的表,它们彼此没有任何共同点,所以我们不能为它们创建基类。一些帖子
甚至包含产品
。下面是我们应该如何处理它们:
Post
和Product
(例如Facebook上的新闻提要)Post
或Product
。因此,我们可以将Post
或Product
作为消息的附件发送(因此,我们应该将发送的Post
或Product
的id存储在服务器端数据库的messages
表的附件项
列中)那么,什么样的设计模式在这里是最好的呢?如何实现
Post
和Product
类?我认为解决方案可能比您想象的简单。为什么不使用一个通用的Java
类接口并隐藏实现细节呢
只需使用所需的方法实现一个公共接口。假设此公共接口被称为EntityInterface
:
public class Post implements EntityInterface {};
public class Product implements EntityInterface {};
然后,当您想要处理这些类时,可以将它们视为EntityInterface
对象:
EntityInterface myNewPost = new Post();
EntityInterface myNewProduct = new Product();
//Now you see myNewProduct and myNewPost as EntityInterface objects
这些代码片段在
Java
中,但在C++
中使用虚拟函数,您也会得到相同的结果。这是一个非常广泛的问题,但这里是您可以使用的框架,只是给您一些想法:
// 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) { }
}
关于数据库表示,正如他在评论中建议的fuseled
,只需将它们放在两个单独的表中即可。中间有一个映射表,用于将产品链接到其帖子
编辑
关于MESSAGES表的问题
您可以添加一个新的映射表MESSAGE\u ATTACHED\u项,其中包含列messageId
,postId
,productId
。将项目附加到邮件时,仅将值设置为相关列
或者,另一种选择是使用仅带有id的附加_ITEM表。
并使Post和Product表具有此表Id的外键。
然后,您可以将此AttachedItem粘贴到您的attached_item列中嗯,它们有一些共同点,它们都可以在列表中,都可以共享,都可以作为附件发送。您可能需要这些接口。对于其他人来说,这确实是一个广泛的问题。您还需要使用合成,因为帖子应该有一个产品列表。@Bentaye ok,但它们应该如何存储在DB中?你认为这个界面应该是什么?它应该是虚拟的还是更有用的?保留3个表:POST、PRODUCTS和MAP\u POST\u PRODUCTS。当一篇文章包含一个产品时,您可以将映射放入MAP\u post\u PRODUCTS表。@Fuseled这是可以的,但是my 3项目中附加项目的
消息表和列呢?谢谢您的回答,但是我们仍然对my 3项目中附加项目的消息表和列有问题,我们该怎么办?谢谢你的回答,我理解你的想法。但是我们仍然对问题中我的3个项目中的附加项目的消息表和列有问题,我们应该怎么做?@don prog我不理解您的问题,您已经说过,您将在MESSAGES表的attached_项中存储邮件或邮件附带产品的id。关于这一点,您还想知道什么?对不起,如果不清楚,我的意思是我们应该以某种方式将发送的Post
或产品的id
存储在消息
表的附加项
列中。但是,如果Post
和Product
在数据库中有不同的类型和不同的表,我们怎么能做到这一点呢?@don prog Right,您担心Post和Product可能具有相同的id?添加一个列附加的项目类型
,该列的值为post
或产品
,这样您就知道要在哪个表中查看它了up@Then那么带有messageId、postId、productId列的MESSAGE\u ATTACHED\u ITEM表呢?前两个ID中只有一个具有值,另一个保持为空
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);