Design patterns 向世界其他地方隐藏一些仅由内部类使用的方法

Design patterns 向世界其他地方隐藏一些仅由内部类使用的方法,design-patterns,encapsulation,proxy-classes,Design Patterns,Encapsulation,Proxy Classes,简短问题 我有一个C++域模型。它有一些内部API使用的方法以及其他公共方法我不想公开那些API方法。我正在考虑使用代理模式来隐藏那些方法。你认为这是个好主意吗?是否有一些设计模式可以实现这一点 长示例 比如说,在某个远程位置有一个机械臂,可以由软件控制,也可以由一些技术人员手动移动。它有一些传感器,可以让它知道它持有的是哪种物体。在我的项目中,它是完全不同的,但我只是以它为例。所以我有一个RobotArm类,它包含一个RobotHeldObject抽象类。机器人手臂让你知道它拿着的是哪个机器人

简短问题

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

长示例

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

---------------------------------------------
RoboticArm
---------------------------------------------
+ heldObject()             RoboticHeldObject*
+ moveUp()
+ moveDown()
+ releaseObject()
+ holdObject(RoboticHeldObject*)
---------------------------------------------
- heldObject               RoboticHeldObject*
- service                  RobotService
由于实现非常复杂,我使用了一个外部类RobotService,它实际执行了这项艰巨的工作。然而,它不是一个贫乏的领域模型,因为它是RobotArm实际使用RobotService(因此具有功能性),而世界其他地方对RobotService一无所知

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

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

要隐藏这些方法,我将RobotArm重命名为RealRobotArm,并创建RobotArm代理类:

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



---------------------------------------------
RealRoboticArm    (the real object)
---------------------------------------------
+ heldObject()             RoboticHeldObject*
+ moveUp()
+ moveDown()
+ releaseObject()
+ holdObject(RoboticHeldObject*)
---------------------------------------------
- heldObject               RoboticHeldObject*
- service                  RobotService
由于RobotArm是代理,RobotArm::HeldoObject()将调用realArm->HeldoObject()、RobotArm::moveUp()realArm->moveUp()等等

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

问题


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

通常有做相同事情的类,但抽象级别不同

例如,在降低抽象级别时:

  • 抓取机器人。抓取瓶子()
  • 空间机器人手臂移动到坐标系(x,y)
  • 机器人基地。转弯(度),机器人手臂。伸展(英寸)
  • 机器人转弯(度)
  • 机器人伺服电机。转动(循环)
  • 机器人伺服继电器。开启(秒)
在您的示例中,RobotArm已经从RealRobotArm中抽象出了对事物的控制。机器人手臂不是设置和释放东西,而是神奇地知道它是否在拿东西以及拿什么。这既不是代理也不是适配器


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

通常有做相同事情的类,但抽象级别不同

例如,在降低抽象级别时:

  • 抓取机器人。抓取瓶子()
  • 空间机器人手臂移动到坐标系(x,y)
  • 机器人基地。转弯(度),机器人手臂。伸展(英寸)
  • 机器人转弯(度)
  • 机器人伺服电机。转动(循环)
  • 机器人伺服继电器。开启(秒)
在您的示例中,RobotArm已经从RealRobotArm中抽象出了对事物的控制。机器人手臂不是设置和释放东西,而是神奇地知道它是否在拿东西以及拿什么。这既不是代理也不是适配器


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

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


using类将使用其接口,即没有API方法的接口,因此无法调用API方法。

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


使用类将使用其接口,即没有API方法的接口,因此无法调用API方法。

请简化并缩短您的问题。请简化并缩短您的问题。因此,这不是设计模式,只是一个抽象,好吗。你认为我不应该从公共API抽象设置和发布东西吗?正如我所揭示的,arm所持有的对象可能在应用程序的控制之外发生更改。因此,从机器人手臂的角度来看,这将神奇地发生,因为它什么也没做。对象只会收到服务“通知”的更改,服务就是接收相应网络事件的人。谢谢。这不是一个设计模式,只是一个抽象,好吗。你认为我不应该从公共API抽象设置和发布东西吗?正如我所揭示的,arm所持有的对象可能在应用程序的控制之外发生更改。因此,从机器人手臂的角度来看,这将神奇地发生,因为它什么也没做。对象只会收到服务“通知”的更改,服务就是接收相应网络事件的人。谢谢。记住它是C++,不是java。我