桥接模式——两个例子比较
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";
}
};
我一直在想,这两个例子在某种程度上都符合这种模式的结构,而且在我看来,它的描述也是正确的。但是我找不到任何合适的解释来回答这个问题。
第一个例子看起来像普通的旧作文。 Button
class虽然标为抽象,但实际上是具体的class;所以具体有一个抽象。
在桥接模式中,“桥接”关系是两个抽象之间的关系,其中high-level抽象有一个low-level抽象。这就是第二个例子中所描述的。
术语令人困惑,因为模式称为“实现者”的东西也是一种抽象:它是 high-level 抽象在其实现中使用的 low-level 抽象。
桥使用组合连接两个独立的继承层次结构。这两个层次结构通过不同的 subclasses 集独立变化。第二个例子有两组不同的 subclasses。第一个例子没有。
我想知道这两个示例(或都不是)是否都是桥接模式。所以第一个:
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";
}
};
我一直在想,这两个例子在某种程度上都符合这种模式的结构,而且在我看来,它的描述也是正确的。但是我找不到任何合适的解释来回答这个问题。
第一个例子看起来像普通的旧作文。 Button
class虽然标为抽象,但实际上是具体的class;所以具体有一个抽象。
在桥接模式中,“桥接”关系是两个抽象之间的关系,其中high-level抽象有一个low-level抽象。这就是第二个例子中所描述的。
术语令人困惑,因为模式称为“实现者”的东西也是一种抽象:它是 high-level 抽象在其实现中使用的 low-level 抽象。
桥使用组合连接两个独立的继承层次结构。这两个层次结构通过不同的 subclasses 集独立变化。第二个例子有两组不同的 subclasses。第一个例子没有。