【发布时间】:2014-08-18 05:09:35
【问题描述】:
在我的代码中,我希望能够“构建”这样的对象..
// Build a Person instance and add types that the person is
Person person = new Person();
person = new Leader(person);
person = new Secretary(person);
person = new Parent(person);
上述代码的目标是构建一个添加了多种类型的基础对象——领导者、秘书和父对象。具体来说,我的目标是能够构建一个基础对象(Person)并使该对象能够同时采用多种类型,以便以下条件返回 true:
(((人是领导) && (人是秘书) && (人是家长))
是否有我可以使用的设计模式来完成此任务?
上述示例的问题在于,person 对象一次只能是一个子类型,并且所有之前的实例显然都被覆盖了。换句话说,唯一会返回 true 的条件是 (person is Parent),因为它是最后一行。
注意:我最初认为装饰器模式听起来就像我需要的那样,但从我的阅读中,装饰器模式似乎更多的是关于将行为添加到对象与扩展其类型相反。
更新
为了清楚起见 - 我想我应该在我的 OP 中提到我正在尝试使用我的类创建一个反映我的 RDBM 设计的设计。
所以,继续原来的例子 -
我的 RDBM 包含表 Person、Leader、Secretary 和 Parent。 Person 表具有 PersonId PK,其他表具有 PersonId FK。
当我执行一个连接所有表的查询时,我可以确定哪些 Person 记录在子表中具有非空 FK。
展平后,查询结果可能如下所示:
PersonId | FirstName | LeaderId | LeaderApproved | SecretaryId | SecretaryFavPencil | ParentId
----------------------------------------------------------------------------------------------
100 | Frank | 34 | True | Null | Null | 700
----------------------------------------------------------------------------------------------
743 | Dweezil | 43 | False | 343 | Ticon | 654
----------------------------------------------------------------------------------------------
567 | Ahmet | Null | Null | Null | Null | 123
----------------------------------------------------------------------------------------------
上面的结果表向我们展示了弗兰克是领导者和家长; Dweezil 是领导者、秘书和家长,Ahmet 只是家长。
在我的数据访问层中,我使用一个查询来检索所有 Person 记录及其关联的 FK 表,实例化 Person 对象,然后将 List 返回给调用者。
然后,调用者可以对 Person 对象做任何他需要做的事情,但他可以通过 (person is Leader) 检查 Person 对象的所有类型。
【问题讨论】:
-
在我看来,这正是工厂模式的设计目的。当然,除非我错过了图片中的某些内容。
-
@Leron OP 不希望每个任务都有一个“新”人,但他想为现有人分配一个新角色。这就像多重继承。在基本类型的人背后隐藏着一个可以承担不同角色的精致对象。哦,显然继承关系是在运行时动态建立的。
-
如果两种类型有相同的方法怎么办?你应该包括你打算如何使用它。如果只是添加类型而不是不同的行为,请使用标志枚举。如果要添加行为,则可以改用组合(例如,使用 Builder 设计模式)。
标签: c# design-patterns decorator