我有一个类Command,它是一个类的实例EventManager.Class Command 在其构造函数中需要两个参数(host,target).
class EventManager
{
public:
void Event1(){ cmd->Execute(_eventEnum); }
private:
Command *cmd;
};
class Command
{
public:
Command(Host h, Target t)
void Execute();
private:
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我需要cmd->Execute()在Target类的成员函数中使用此方法,我需要创建cmdTarget的实例变量或将其作为单例全局化.
我不能创建cmd一个Target的实例变量,因为它不接受主机实例.要使它成为单身,就可以添加两个这样的方法
class Command
{
public:
CreateInstance(Host h, Target t);
GetInstance();
void Execute();
private:
Command(Host h, Target t);
}
Run Code Online (Sandbox Code Playgroud)
我需要确保GetInstance在之后调用CreateInstance.还有其他选择吗?
目标类是一个低级别的类,几乎没有事件.
Target::LowlevelEvent()
{
cmd->Execute(lowlevelevent) //In Execute for lowlevelevent in Command class, i might call target->reset
}
Run Code Online (Sandbox Code Playgroud)
我很抱歉无法解释清楚.问题是,这段代码有很多事件(方法),可能在像EventManager或Target这样的类中.
在每个事件中,我都必须调用Command-> Execute().命令类需要主机和目标实例,因为它们可以执行某些操作.
EventManager :: Event1(){cmd-> Execute(_event1); }
Target :: Event2(){cmd-> Execute(_event2); }
Command :: Execute(事件e){if(_event1 == e){host-> CallAction(); } if(_event2 == e){target-> CallSomeOtherAction(); }
}
那么现在cmd需要是EventManager和Target的实例变量吗?现在EventManager有主机和目标实例,可以传递给Command ctor.
但Target无法访问主机.所以我无法在Target类中创建Command实例.
所以我想知道我是否在EventManager ctor中创建了单例.然后在Target中调用GetInstance().我知道它的坏主意,但凭借这个巨大的设计,我无法弄明白.谢谢你的帮助.
我真的不明白你的问题,但是,从标题来看,我可以这样说:不要使用单身人士.它需要参数的事实是单例模式的一个非常好的反指标.
如果要确保使用相同的参数创建所有命令,可以为客户端提供CommandFactory创建命令实例的命令.
class CommandFactory {
public:
CommandFactory(std::string host, std::string target)
: m_host(host),
m_target(target)
{}
boost::shared_ptr<Command> createCommand() {
return boost::shared_ptr<Command>(new Command(m_host, m_target));
}
private:
std::string m_host;
std::string m_target;
};
Run Code Online (Sandbox Code Playgroud)
然后,您还可以实现某种对象池来重用对象.
| 归档时间: |
|
| 查看次数: |
4349 次 |
| 最近记录: |