桥接模式——两个例子比较

Bridge pattern - two examples comparison

我想知道这两个示例(或都不是)是否都是桥接模式。所以第一个:

class ButtonImpl {
    public:
    virtual void click() = 0;
};

// concrete implementation
class ToggleButtonImpl : public ButtonImpl {
    public: 
    void click() {
        cout << "Push\n";
    }
};

// concrete implementation
class PushButtonImpl : public ButtonImpl {
    public: 
    void click() {
        cout << "Push\n";
        cout << "Pop\n";
    }
};

// abstraction
class Button {
    public: 
    Button(ButtonImpl* buttonImpl) : m_buttonImpl{ buttonImpl }
    {
    }
    void click() {
        m_buttonImpl->click();
    }
    
    private: 
    ButtonImpl* m_buttonImpl;
};

第二个:

// implementation
class ButtonImpl {
    public:
    virtual void click() = 0;
};

// concrete implementation
class WindowsButtonImpl : public ButtonImpl {
    public:
    void click() { cout << "windows system\n"; }
};

// concrete implementation
class LinuxButtonImpl : public ButtonImpl {
    public:
    void click() { cout << "linux system\n"; }
};

// abstraction
class Button {
    public:
    Button(ButtonImpl* buttonImpl) : m_buttonImpl{ buttonImpl } {}
    virtual void click() = 0;
    protected:
    ButtonImpl* m_buttonImpl;
};

// concrete abstraction
class ToggleButton : public Button {
    public: 
    ToggleButton(ButtonImpl* buttonImpl) : Button(buttonImpl) {};
    void click() {
        m_buttonImpl->click();
        if(state) {
            cout << "Push\n";
            state = 0;
        } else {
            cout << "Pop\n";
            state = 1;
        }
    }
    private:
    bool state;
};

// concrete abstraction
class PushButton : public Button {
    public: 
    PushButton(ButtonImpl* buttonImpl) : Button(buttonImpl) {};
    void click() {
        m_buttonImpl->click();
        cout << "Push\n";
        cout << "Pop\n";
    }
};

我一直在想,这两个例子在某种程度上都符合这种模式的结构,而且在我看来,它的描述也是正确的。但是我找不到任何合适的解释来回答这个问题。

第一个例子看起来像普通的旧作文。 Buttonclass虽然标为抽象,但实际上是具体的class;所以具体有一个抽象。

在桥接模式中,“桥接”关系是两个抽象之间的关系,其中high-level抽象有一个low-level抽象。这就是第二个例子中所描述的。

术语令人困惑,因为模式称为“实现者”的东西也是一种抽象:它是 high-level 抽象在其实现中使用的 low-level 抽象。

桥使用组合连接两个独立的继承层次结构。这两个层次结构通过不同的 subclasses 集独立变化。第二个例子有两组不同的 subclasses。第一个例子没有。