我有几个实例,客户端代码必须执行 if 检查,如下所示:
void Client::Method1()
{
if (flag is true)
{
m_Object.DoSomething();
}
else
{
m_Object.DoSomethingElseInstead();
}
}
void Client::Method2()
{
if (flag is true)
{
m_Object.DoSomething2();
}
else
{
m_Object.DoSomethingElseInstead2();
}
}
void Client::Method3()
{
if (flag is true)
{
m_Object.DoSomething3();
}
else
{
m_Object.DoSomethingElseInstead3();
}
}
等等...
我想封装 if (flag) 检查是否可以在 m_Object 中以某种方式在内部处理。我想过使用 PIMPL 习惯用法,但实际上我需要的只是以某种方式封装此行为。有没有更简单的方法来做到这一点?
最佳答案
您可以使用strategy pattern 。像这样的东西:
class Strategy
{
public:
virtual ~Strategy() = default;
virtual void Method1() = 0;
virtual void Method2() = 0;
virtual void Method3() = 0;
};
class Strategy1 : public Strategy
{
public:
explicit Strategy1(Client& client) : client(client) {}
void Method1() override {client.m_Object.DoSomething();}
void Method2() override {client.m_Object.DoSomething2();}
void Method3() override {client.m_Object.DoSomething3();}
private:
Client& client;
};
class Strategy2 : public Strategy
{
public:
explicit Strategy2(Client& client) : client(client) {}
void Method1() override {client.m_Object.DoSomethingElseInstead();}
void Method2() override {client.m_Object.DoSomethingElseInstead2();}
void Method3() override {client.m_Object.DoSomethingElseInstead3();}
private:
Client& client;
};
class Client
{
public:
Client() { SetFlag(true); }
void Method1() { strategy->Method1(); }
void Method2() { strategy->Method2(); }
void Method3() { strategy->Method3(); }
void SetFlag(bool flag) // or better: SetStrategy
{
if (flag) {
strategy = std::make_unique<Strategy1>(*this);
} else {
strategy = std::make_unique<Strategy2>(*this);
}
}
private:
std::unique_ptr<Strategy> strategy;
Object m_Object;
};
关于c++ - 在类中封装多个 if 语句的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30313784/