以复合模式访问特定的复合数据

时间:2013-08-23 01:58:47

标签: design-patterns composite

假设我有一个Item类,它是复合模式的基类。

我有两个特定的子类Movie和Music包含不同的数据:

  • 电影:导演,制片人,演员名单......
  • 音乐:chanteur,已售出的唱片数量......

如果我想在客户端代码中访问Movie数据(例如),我需要向下转换与之对应的Item,因为getProducer()不是Item类的方法。

我陷入了三种不同的方法之中:

  1. 将所有子类方法放在Item接口
  2. 客户端代码中的Downcast项目
  3. 使用将从不同项目中提取数据的对象(使用一种访问者模式)
  4. 第三个命题似乎很有趣,因为它将Item子类隐藏到客户端,但我不知道如何让客户端更新Item(例如更改电影的制作者)。

    应用程序支持的Item子类型将通过发行版增长,我想设计它以方便这些类型的添加。

    也许我完全走错了方向,并且有一个不同的更好的解决方案。

2 个答案:

答案 0 :(得分:0)

IMO,MovieMusic对象完全不同,不应从公共基类派生。但是,如果您仍想这样做,请修改Item类,如下所示(只是示例代码。请不要按原样使用此代码)

abstract class Item
{
    virtual object GetData(string sDataID);
}

现在,在派生类中,您可以覆盖此方法,如下所示。

class Movie: Item
{
    private Producer m_Producer = new Producer();
    override object GetData(string sDataID)
    {
        object ret = null;
        switch(sDataID)
        {
            case "Producer":
               ret = m_Producer;
               break;
        }           
    }

并且,在客户端代码中,您可以执行以下操作。

Item objItem = new Movie();
Producer objProducer = (Producer)objItem.GetData("Producer");

你明白了!

答案 1 :(得分:0)

选项1是个坏主意,因为getProducer()不属于某个项目。

如果除了计划在那里实施的getter方法之外你还要证明了setter,那么选项3也会有效。

选项2对我来说听起来最合理。在多态解决方案中,转换是一项常见任务,在您的情况下,它就足够了。