桥梁模式
Decouple an abstraction from its implementation so that the two can vary independently.
(将抽象和实现解耦,使得两者可以独立地变化。)
通用类图
抽象化角色
定义出类的行为,同时保存一个对实现类的引用
实现化角色
依赖抽象化角色类,接口或抽象类,定义角色必须的行为和属性
修正抽象化角色
继承抽象化角色类,引用实现化角色对抽象化角色进行修正
具体实例化角色
继承实现化角色类,实现接口或抽象类定义的方法和属性
通用源码
//实现化角色
class Implementor {
public:
virtual void doSomething() = 0;
virtual void doAnything() = 0;
};
//具体实例化角色
class ConcreteImplementor1 : public Implementor {
public:
void doSomething() override {
//业务逻辑处理
}
void doAnything() override {
//业务逻辑处理
}
};
//抽象化角色
class Abstraction {
private:
//定义对实现化角色的引用
Implementor *impl;
public:
约束子类必须实现该构造函数
Abstraction(Implementor* i): impl(i) { }
//自身的行为和属性
void request() {
impl->doSomething();
}
//获得实现化角色
Implementor* getImp() { return impl; }
};
//具体抽象化角色
class RefinedAbstraction : public Abstraction {
public:
RefinedAbstraction(Implementor* i): Abstraction(i) { }
void request() {
//业务逻辑处理
Abstraction::request();
Abstraction::getImp()->doAnything();
}
};
优点
抽象和实现分离
优秀的扩充能力
实现细节对客户透明
使用场景
不希望或不适用使用继承的场景
接口或抽象类不稳定的场景
重用性要求较高的场景
注意事项
如何拆分抽象和实现是关键。
示例代码
#include <iostream>
#include <string>
using namespace std;
class Product {
public:
virtual void beProducted() = 0;
virtual void beSelled() = 0;
};
class House : public Product {
public:
void beProducted() override {
cout << "construct such house...\n";
}
void beSelled() override {
cout << "sell such house...\n";
}
};
class Ipod : public Product {
public:
void beProducted() override {
cout << "construct such iPod...\n";
}
void beSelled() override {
cout << "sell such iPod...\n";
}
};
class Crop {
public:
Crop(Product *p) {
product = p;
}
void makeMoney() {
product->beProducted();
product->beSelled();
}
private:
Product *product;
};
class HouseCrop : public Crop {
public:
HouseCrop(House h): Crop(&h) { }
void makeMoney() {
Crop::makeMoney();
cout << "HouseCrop make much money...\n";
}
};
class ShanZhaiCrop : public Crop {
public:
ShanZhaiCrop(Product *p): Crop(p) { }
void makeMoney() {
Crop::makeMoney();
cout << "ShanZhaiCrop make much money...\n";
}
};
int main() {
House h;
HouseCrop hc(h);
hc.makeMoney();
ShanZhaiCrop szc(new Ipod());
szc.makeMoney();
return 0;
}