结构型模式-桥接(bridge)

桥接

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

实例

main.cc:

#include 
#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 
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 
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 
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 
using namespace std;

NikeShoe::NikeShoe(){

}

NikeShoe::~NikeShoe(){

}

void NikeShoe::Sale(){
    cout << "NikeShoe sale 500¥!" << endl;
}

代码和UML图(EA)工程文件,最后会整理打包上传.

UML类图

结构型模式-桥接(bridge)_第1张图片

结构

  • Abstraction(Store):抽象类
  • RefinedAbstraction(HelenStore):扩充抽象类
  • Implementor(Shoe):实现类的接口
  • ConcreteImplementor(AsicsShoe,NikeShoe):具体实现类

优点

  • 分离抽象接口及其实现部分.
  • 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法.
  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统.
  • 实现细节对客户透明,可以对用户隐藏实现细节.

缺点

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进.

你可能感兴趣的:(设计模式)