c++ - 在类中封装多个 if 语句的最简单方法?

标签 c++ encapsulation

我有几个实例,客户端代码必须执行 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/

相关文章:

Python 设计指南 :

c++ - Opencv C++ 图像导出到 C#

c++ - qmake 自动生成的 Makefile 编译器设置不正确

c++ - 编译器警告 "Effective C++"s 方法以避免 const 和非 const 成员函数中的重复

JavaScript 与 WebComponents/ShadowDOM 封装

c++ - 为什么 std::pair 暴露成员变量?

c++ - 解决这个问题最省时的方法是什么?

c++ - 与常规缓冲区和制服相反,OpenGL 纹理单元背后的原因是什么?

javascript - 如何使用 VS Code 调试 Node.js 中的私有(private)类字段?

c++ - C++ : classes vs. 结构中的抽象语法树