使用两个完全不同的类作为一个

时间:2018-04-13 05:27:42

标签: database oop inheritance design-patterns

我对设计模式有一个非常愚蠢的问题:让我们说我们有两个类PostProduct,对于每个类我们在DB中有不同的表,它们什么都没有彼此共同,所以我们不能为它们创建基类。有些Posts甚至包含 Products。以下是我们应该对他们做些什么:

  1. 以某种方式在数据库中存储PostProduct个实例,当用户从下一个项目请求新闻提要时,将它们打包到一个数组中(使用C ++,如果重要),将其发送到客户端,并在客户端接收和解包(使用Java)。
  2. 接下来,我们必须在一个列表中显示PostProduct(例如Facebook上的新闻Feed)。
  3. 此外,我们可以使用聊天功能与朋友分享PostProduct。因此,我们可以发送PostProduct作为邮件的附件(因此,我们应该在列Post中存储已发送Productattached_item的ID服务器端DB中的messages表。)
  4. 那么,这里最好的设计模式是什么?我应该如何实施PostProduct类?

2 个答案:

答案 0 :(得分:1)

我认为解决方案可能比您想象的更简单。为什么不使用类似于laravel version 5.3的通用接口并隐藏实现细节?

只需使用您需要的方法实现通用接口即可。假设这个通用接口称为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中使用虚拟函数并获得相同的效果。

答案 1 :(得分:1)

这是一个非常广泛的问题,但这里有你能做到的骨架,只是为了给你一些想法:

// 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) { }
}

然后,您可以通过这种方式互换使用PostProduct

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表的问题

您可以使用列messageIdpostIdproductId添加新的映射表MESSAGE_ATTACHED_ITEM。仅在将项目附加到消息

时,才将值设置为相关列

或者另一种选择是使ATTACHED_ITEM表只有id。 并使Post和Product表具有此表Id的外键。 然后,您可以将此attachItemId粘贴到您的attached_item列