为对象内的对象提供接口

时间:2014-04-22 18:34:37

标签: c++ oop design-patterns model-view-controller facade

我在MVC中创建一个由其他对象组成的模型。我的单个主模型对象包含成分对象。我的问题是,我应该向主要模型对象询问实际上将由成分对象执行的所有操作,还是应该询问成分对象并运行其操作?我可以在第一种方法中看到,主模型将必须考虑其成分模块的所有操作,并将导致添加许多函数,这些函数将简单地委托给组成对象。

让我用一个与我正在做的非常接近的例子来解释。下面的代码正在运行中,请忽略c ++语法错误(如果有的话)。

class Arm
{
public:

    Move(int x, int y);
}

class Robot
{
public:
    Arm leftArm;
    Arm rightArm;

    // should this function be there?
    MoveLeftArm(int x, int y)
    {
        leftArm.Move(x,y);
    }

    // and likewise this?
    MoveRightArm(int x, int y)
    {
        rightArm.Move(x,y);
    }
}

// in the view when I want to move robot arms, should I do this
robot->MoveLeftArm(x,y);
//or this
robot.leftArm.Move(x,y);

转储问题但是它应该取决于成分对象实际支持的操作数量吗?也是因为我们是它,这也是立面设计模式的一个例子吗?

我的担忧:

  • 第一种方法可以将主要对象增长到非常大的对象。我们真的想要这么多方法的大型对象吗?
  • 这种声音像金字塔金字塔模型,其中的功能沿着链条向下延伸。这是否气馁?我似乎记得这样,但我可能错了。
  • 第二种方法是让外部客户端模块直接访问其子组件,不确定这是否完全不合理?

请考虑成分对象不仅仅是上面的两个机器人手臂,它有更多的方法。

1 个答案:

答案 0 :(得分:1)

我认为通常最好是封装数据和行为,并让每个类维护它,这样你就不会在它们之间建立牢固的关系。
所以最好的是View调用Robot.MoveLeftArm和RobotMoveRightArm,机器人是将消息发送到执行实际移动的Arms的那个。 这样,手臂移动的调用和实现被封装在Arm中,它可以在不影响视图的情况下改变 还有一些选项可以让接口定义行为,并让类实际实现该行为,从而在它们之间创建契约。