简短的问题
我有一个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% 确定这是代理模式还是适配器模式。你认为这是为这样一个系统建模的正确方法吗?有更好的模式吗?