结构型模式3-桥接模式
桥接模式bridge
意图
将抽象部分与它的实现部分分离,使它们都可以独立的变化。
问题思考
参考《设计模式》。假设GUI框架支持Windows和macOS。分别有两个子类实现抽象Window:Win32Window, DarwinWindow。现在我们需要抽象一个IconWindow,专门用于Window的图标处理。为了使IconWindow支持Windows和macOS,我们需要两个子类,Win32IconWindow, DarwinIconWindow。那么问题来了,如果我们需要支持Linux平台呢。我们还需要为IconWindow添加一个LinuxIconWindow。这样很繁琐。如果你有更好的办法,说不定恰恰是桥接模式。
适用性
- 不希望抽象在和它的实现部分之间有一个固定的绑定关系。比如希望可以在运行时更换实现。
- 类的抽象和它的实现都可以通过子类的方式扩充(两个不同的变化方向)。Bridge模式使得可以对不同的抽象以及它的实现部分进行组合,并分别对它们进行扩充。
类图
![bridge]
实现
class Abstraction {
public:
virtual void Operation() { impl->OperationImp(); };
private:
Implementor *impl = nullptr; // should be mImpl
};
class Implementor {
public:
virtual void OperationImp() = 0;
};
class RefinedAbstraction : public Abstraction {
public:
// call twice. or whater
virtual void OperationTwice() {
Operation();
Operation();
}
};
class ConcreteImplementorA : public Implementor {
public:
void OperationImp() override {
// some code
}
};
注意:bridge模式和adapter模式的区别。bridge模式的目的是分离抽象和实现,没有改变原来的接口。而adapter的目的是使不兼容的接口兼容,改变了原来的接口(adaptee)。
网友评论