桥接
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
实例
main.cc:
#include <windows.h>
#include "nike_shoe.h"
#include "asics_shoe.h"
#include "helen_store.h"
/*
design_pattern:"bridge"
*/
int main(){
Shoe* asics_shoe = new AsicsShoe();
Shoe* nike_shoe = new NikeShoe();
Store* helen_store = new HelenStore(asics_shoe);
helen_store->Selling();
Store* helen_store_2 = new HelenStore(nike_shoe);
helen_store_2->Selling();
//clear
delete asics_shoe;
delete nike_shoe;
delete helen_store;
delete helen_store_2;
system("Pause");
return 0;
}
Store:
//store.h
#ifndef HELENDP_SOURCE_STORE_H_
#define HELENDP_SOURCE_STORE_H_
#include "shoe.h"
class Store{
public:
Shoe* shoe_;
public:
Store(Shoe *shoe);
virtual ~Store();
Shoe* GetShoe();
virtual void Selling();
};
#endif
//store.cc
#include "store.h"
#include <iostream>
using namespace std;
Store::Store(Shoe * shoe){
this->shoe_ = shoe;
}
Store::~Store(){
}
Shoe* Store::GetShoe(){
return shoe_;
}
void Store::Selling(){
cout << "Store Selling:not run here!" << endl;
}
HelenStore:
//helen_store.h
#ifndef HELENDP_SOURCE_HELEN_STORE_H_
#define HELENDP_SOURCE_HELEN_STORE_H_
#include "store.h"
class HelenStore : public Store{
public:
HelenStore(Shoe *shoe);
~HelenStore();
void Selling();
};
#endif
//helen_store.cc
#include "helen_store.h"
HelenStore::HelenStore(Shoe* shoe):Store(shoe){
}
HelenStore::~HelenStore(){
}
void HelenStore::Selling(){
shoe_->Sale();
}
Shoe:
//shoe.h
#ifndef HELENDP_SOURCE_SHOE_H_
#define HELENDP_SOURCE_SHOE_H_
class Shoe{
public:
Shoe();
virtual ~Shoe();
virtual void Sale();
};
#endif
//shoe.cc
#include "shoe.h"
#include <iostream>
using namespace std;
Shoe::Shoe(){
}
Shoe::~Shoe(){
}
void Shoe::Sale(){
cout << "Shoe Sale: not run here!" << endl;
}
AsicsShoe:
//asics_shoe.h
#ifndef HELENDP_SOURCE_ASICS_SHOE_H_
#define HELENDP_SOURCE_ASICS_SHOE_H_
#include "shoe.h"
class AsicsShoe : public Shoe{
public:
AsicsShoe();
~AsicsShoe();
void Sale();
};
#endif
//asics_shoe.cc
#include "asics_shoe.h"
#include <iostream>
using namespace std;
AsicsShoe::AsicsShoe(){
}
AsicsShoe::~AsicsShoe(){
}
void AsicsShoe::Sale(){
cout << "AsicsShoe Sale 600¥!" << endl;
}
NikeShoe:
//nike_shoe.h
#ifndef HELENDP_SOURCE_NIKE_SHOE_H_
#define HELENDP_SOURCE_NIKE_SHOE_H_
#include "shoe.h"
class NikeShoe : public Shoe{
public:
NikeShoe();
~NikeShoe();
void Sale();
};
#endif
//nike_shoe.cc
#include "nike_shoe.h"
#include <iostream>
using namespace std;
NikeShoe::NikeShoe(){
}
NikeShoe::~NikeShoe(){
}
void NikeShoe::Sale(){
cout << "NikeShoe sale 500¥!" << endl;
}
代码和UML图(EA)工程文件,最后会整理打包上传.
UML类图
结构
- Abstraction(Store):抽象类
- RefinedAbstraction(HelenStore):扩充抽象类
- Implementor(Shoe):实现类的接口
- ConcreteImplementor(AsicsShoe,NikeShoe):具体实现类
优点
- 分离抽象接口及其实现部分.
- 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法.
- 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统.
- 实现细节对客户透明,可以对用户隐藏实现细节.
缺点
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进.