桥式模式-两个例子比较



我想知道这两个例子(或两者都不是)是桥模式。第一个:

class ButtonImpl {
public:
virtual void click() = 0;
};
// concrete implementation
class ToggleButtonImpl : public ButtonImpl {
public: 
void click() {
cout << "Pushn";
}
};
// concrete implementation
class PushButtonImpl : public ButtonImpl {
public: 
void click() {
cout << "Pushn";
cout << "Popn";
}
};
// 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 systemn"; }
};
// concrete implementation
class LinuxButtonImpl : public ButtonImpl {
public:
void click() { cout << "linux systemn"; }
};
// 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 << "Pushn";
state = 0;
} else {
cout << "Popn";
state = 1;
}
}
private:
bool state;
};
// concrete abstraction
class PushButton : public Button {
public: 
PushButton(ButtonImpl* buttonImpl) : Button(buttonImpl) {};
void click() {
m_buttonImpl->click();
cout << "Pushn";
cout << "Popn";
}
};

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

第一个例子看起来像普通的旧组合。虽然Button类被标记为抽象,但它实际上是一个具体类;所以集合有一个抽象。

在桥式模式中,"桥"关系是两个抽象之间的关系,其中高级抽象具有低级抽象。这就是第二个例子所描述的。

术语变得令人困惑,因为模式所称的"实现者";也是一个抽象:它是高级抽象在其实现中使用的低级抽象。

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

最新更新