层次结构和设计模式问题

Fdo*_*do. 5 design-patterns hierarchy

我正在为系统建模文档类.该文档可以是以下两种类型之一:inout.

如果类型是,文档有一个发件人.发件人可以是以下两种类型之一:个人或公司.

如果类型不存在,则文档具有接收器.接收器可以是三种类型之一:人,公司,部门.

我不确定使用带有枚举的属性是否更好,或者使用带有文档基类的层次结构和每种类型文档的两个类.

对于发件人和收件人,我不确定层次结构是否是一个好的选择,因为这三种类型没有任何共同点(人员,公司,部门)以及如何避免无效的发件人.

如果你能给我一些关于如何建模文档类的建议,或者你能告诉我一些我应该使用的设计模式,那将是一件好事.

提前致谢.


in和out之间只有一些差异,相同的字段除了发送方和接收方之外.此外,行为是相同的一点点变化.

发件人和收件人没有任何行为,他们唯一需要做的就是包含正确的对象,例如发件人可以包含个人或公司但不包含部门,因为部门不是有效的发件人.此外,如果发件人包含某个人,则它不能包含公司,因为只接受一个发件人.

主要问题是当我拿到文档时如何读取发送者或接收者,我必须读取该数据.例如,如果我必须阅读发件人,并且我使用带有发件人类型的枚举,我必须执行这样的代码,如果发件人==读人并将其分配给其他人阅读公司并分配给公司.如果我使用继承,我如何避免使用强制转换或我如何知道发件人是没有这么多代码或演员的人或公司.再次感谢.

der*_*rdo 0

基本上可以归结为这一点。如果有像这样的 if 语句

if(document.IsIncoming()){
  do something
}elseif (document.SentToDepartment()) {
  do something else
}
Run Code Online (Sandbox Code Playgroud)

重复不止几个地方,您最好使用某种多态解决方案(想想抽象类或接口)。发送者和接收者类型也是如此。

但是,您不需要在顶部进行子类化。您可以通过多态性将不同行为附加到单个文档类。假设传入和传出文档的打印行为不同。然后创建 IPrinter 接口并在两个类中实现它,如下所示。

public class Document
{
  DocumentType type;
  IPrinter printer;
}
interface IPrinter{
  print();
}

class IncomingPrinter :IPrinter{}

class OutgoingPrinter :IPrinter{}
Run Code Online (Sandbox Code Playgroud)

每当决定要传入文档时(可能是在创建文档时),您都可以分配 IncomingPrinter。如果有多种类型的行为需要像这样分配,通常会使用工厂模式。通过这种方式,您可以将 if(doc.IsIncoming()) 语句本地化到一处。不在代码中的不同位置重复决策的好处有很多。