【问题标题】:State design pattern - Passing Objects状态设计模式 - 传递对象
【发布时间】:2015-06-08 20:30:08
【问题描述】:

我有一个具有 3 种状态的状态设计模式实现:

State1::DoTask(){...}

State2::DoTask(){...}

State3::DoTask(){...}

这 3 个状态都需要使用 2 个已经实例化的类

例如

State1::DoTask()
{ 
    sensor->GetData(...)
    server->Send(buf,size)
}

将这 2 个类指针对象传递给 State1、State2 和 State3 的最佳方法是什么?

我想到了两种选择:

1) Sensor 和 Server 类可以是单例:

State1::DoTask()
{
    sensor = Sensor::GetInstance();
    server = Server::GetInstance();
    ....
}

2) 使用其他对象持有类指针传递:

class ComClasses
{
    Sensor *sensor;
    Server *server;
}

State1::DoTask(ComClasses *c)
{
    ....
}

在您看来,最好的方法是什么?有没有更好的解决方案?

最好的问候,

【问题讨论】:

  • 为什么不将指针作为参数传递给DoTask?为什么不用引用而不是指针?
  • 是的,它可以作为参考。但这并不能解决答案。谢谢
  • 您问是否有更好的解决方案,如果指针永远不应为空,则引用是更好的解决方案。也就是说,我没有给出建议作为答案,而是发表评论。您是否考虑按照我的建议将引用作为参数传递给 DoTask

标签: c++ design-patterns


【解决方案1】:

你也可以在初始化状态时这样做。

State1 state1( sensor, server );
State2 state2( sensor, server );
State3 state3( sensor, server );

然后 DoTask 接口方法,即您的客户端方法,不应该关心每个单独的 State 类的实现。每个州都将使用自己的信息来实施。

state1.DoTask();
...

要评论您的解决方案,我想我更喜欢单例。 如果您发现每个状态都需要使用一个新对象,您可能会不断添加参数。您的第二个解决方案解决了这个问题,但您可能会将对象传递给不需要使用它们的状态。

但也许初始化是最好的。

【讨论】:

  • 嗨 Aslg,我将添加更多对象,它们不会被每个州使用。假设我添加了更多 4 个对象,通过引用传递它们会占用太多函数参数。我想我会单身。最好的问候:)
猜你喜欢
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 2019-06-25
  • 1970-01-01
  • 2019-10-27
相关资源
最近更新 更多