2

简短的问题

我有一个C++域模型。它有一些内部 API 使用的方法以及其他公共方法我不想公开那些 API 方法。我正在考虑使用代理模式来隐藏这些方法。你认为这是个好主意吗?是否有一些设计模式可以实现这一目标?

长示例

假设在某个远程位置有一个机械臂,它可以由软件控制,但也可以由一些技术人员手动移动。它有一些传感器,可以让它知道它拿着哪种物体。在我的项目中,情况完全不同,但我只是以此为例。所以我有一个包含RoboticHeldObject抽象类的 RoboticArm 类RoboticArm让您知道它持有哪个RoboticHeldObject,除了让您移动手臂。但是,您不能决定拾取和释放对象。这是由操作机器人的技术人员决定的。所以它会是这样的:

---------------------------------------------
RoboticArm
---------------------------------------------
+ heldObject()             RoboticHeldObject*
+ moveUp()
+ moveDown()
+ releaseObject()
+ holdObject(RoboticHeldObject*)
---------------------------------------------
- heldObject               RoboticHeldObject*
- service                  RobotService

由于实现相当复杂,我使用了一个外部类,RobotService,它实际上执行了艰苦的工作。但是,它不是贫血域模型,因为它是RoboticArm实际使用RobotService(因此具有功能),而世界其他地方对RobotService 一无所知

这里的问题是: releaseObject ()holdObject()是此处仅由RobotService使用的 API 方法。仅当技术人员释放手臂握住的物体或放置新物体时, RobotService才会调用它们。因此,当RobotService处理某些网络事件时调用它们(请记住,手臂位于远程位置,因此事件是通过网络接收的)。例如:

RobotService::handleObjectReleaseEvent(event)
{
 RoboticArm *arm = correspondingRoboticArm(event);
 arm->releaseObject();
}

我的方法

要隐藏这些方法,我会将 RoboticArm 重命名RealRoboticArm创建一个RoboticArm代理类:

---------------------------------------------
RoboticArm        (the proxy)
---------------------------------------------
+ heldObject()             RoboticHeldObject*
+ moveUp()
+ moveDown()
---------------------------------------------
- realArm                  RoboticArm*



---------------------------------------------
RealRoboticArm    (the real object)
---------------------------------------------
+ heldObject()             RoboticHeldObject*
+ moveUp()
+ moveDown()
+ releaseObject()
+ holdObject(RoboticHeldObject*)
---------------------------------------------
- heldObject               RoboticHeldObject*
- service                  RobotService

由于RoboticArm是一个代理,RoboticArm::heldObject() 将调用 realArm->heldObject()、RoboticArm::moveUp() realArm->moveUp() 等等。

RobotService将有一个指向RealRoboticArm实例的指针,因此它可以调用 API 方法,例如 releaseObject() 但是,应用程序的其他部分只能使用RoboticArm中的方法,因为它们没有指向RealRoboticArm的指针。因此releaseObject ()holdObject()将对观众有效地隐藏起来。

问题

我不是 100% 确定这是代理模式还是适配器模式。你认为这是为这样一个系统建模的正确方法吗?有更好的模式吗?

4

2 回答 2

0

您可以使用接口解决您的问题。您有一个对象 RobotArm,它实现了两个接口:一个用于 API,一个用于使用类。

using 类将使用它的接口,没有API 方法的接口,因此不能调用API 方法。

于 2010-08-22T11:04:11.297 回答
0

通常有类做同样的事情,但在不同的抽象层次上。

例如,在降低抽象级别:

  • GrabbingRobot.GrabBottle();
  • SpaciousRobotArm.MoveToCoordinates(x, y);
  • RobotBase.Turn(度),RobotArm.Extend(英寸)
  • RobotElbow.Bend(度)
  • RobotServoMotor.Turn(循环)
  • RobotServoRelais.TurnOn(秒)

在您的示例中,RoboticArm 已经从 RealRoboticArm 中抽象出对事物的持有。RoboticArm 不是设置和释放东西,而是神奇地知道它是否拿着东西以及它拿着什么。这既不是代理也不是适配器。

没有足够复杂的权限结构来阻止 GrabbingRobot 直接调用 RobotElbow。

于 2010-08-22T11:01:23.843 回答