Bridge Pattern with C++

桥梁模式 C++实现

桥梁模式主要解决多层继承,比如我们可以想想,人可以分为男人女人,人又有不同的行为。如果把这个两个class继承,也就意味着是男人行为A,男人行为B。女人行为A,女人行为B。 这种方式非常难以扩展,所以桥梁模式派上用场,它将表示和实现解耦,两者可以独立的变化。 #####也就是抽象出人和行为,然后人调用行为,减少了继承的class。

其中这种模式又有一些像策略模式,又有一些像建造者模式。

#####当我们考虑一个对象的多个变化因素可以动态变化的时候,考虑使用桥接模式

优点

1.将实现抽离出来,再实现抽象,使得对象的具体实现依赖于抽象,满足了依赖倒转原则。

2.将可以共享的变化部分,抽离出来,减少了代码的重复信息。

3.对象的具体实现可以更加灵活,可以满足多个因素变化的要求。

缺点

1.客户必须知道选择哪一种类型的实现。

如果我们用山寨工厂和房地产工厂生产产品做例子,非常清晰易懂。

####这里我们要知道class IProduct中有两个虚基类,用于动态绑定!


#include 
#include 
#include 
using namespace std;
 
class IProduct
{
public:
    IProduct(void)
    {
    }
    virtual ~IProduct(void)
    {
    }
    virtual void BeProducted() = 0;
    virtual void BeSelled() = 0;
};
 
class CNewCorp
{
public:
    CNewCorp(IProduct *pproduct)
    {
        this->m_pProduct = pproduct;
    }
    virtual ~CNewCorp(void){}
    void MakeMoney()
    {
        //每个公司都是一样,先生产
        this->m_pProduct->BeProducted();
        //然后销售
        this->m_pProduct->BeSelled();
    }
private:
    IProduct *m_pProduct;
};
class CHouse : public IProduct
{
public:
    CHouse(void){}
    ~CHouse(void){}
    void BeProducted(){cout << "生产出的房子是这个样子的..." << endl;}
    void BeSelled(){cout << "生产出的房子卖出去了..." << endl;}
};
 
class CClothes : public IProduct
{
public:
    CClothes(void){}
    ~CClothes(void){}
    void BeProducted(){cout << "生产出的衣服是这个样子的..." << endl;}
    void BeSelled(){cout << "生产出的衣服卖出去了..." << endl;}
};
 
class CNewHouseCorp : public CNewCorp
{
public:
    CNewHouseCorp(CHouse *pHouse):CNewCorp(pHouse){}
    ~CNewHouseCorp(void){}
    void MakeMoney()
    {
        this->CNewCorp::MakeMoney();
        cout << "房地产公司赚大钱了..." << endl;
    }
};
 
class CIPod :public IProduct
{
public:
    CIPod(void){}
    ~CIPod(void){}
    void BeProducted(){cout << "生产出的ipod是这个样子的..." << endl;}
    void BeSelled(){ cout << "生产出的ipod卖出去了..." << endl;}
};
 
class CShanZhaiCorp : public CNewCorp
{
public:
    CShanZhaiCorp(IProduct *pproduct): CNewCorp(pproduct){}
    ~CShanZhaiCorp(void){}
    void MakeMoney()
    {
        this->CNewCorp::MakeMoney();
        cout << "我赚钱呀..." << endl;
    }
};
void DoNewRun1()
{
    cout << "----------房地产公司是这样运行的----------" << endl;
    CHouse house;
    CNewHouseCorp newHouseCorp(&house);
    newHouseCorp.MakeMoney();
    cout << endl;
 
    cout << "----------山寨公司是这样运行的----------" << endl;
    CClothes clothes;
    CShanZhaiCorp shanZhaiCorp(&clothes);
    shanZhaiCorp.MakeMoney();
    cout << endl;
}
 
void DoNewRun2()
{
    cout << "----------房地产公司是这样运行的----------" << endl;
    CHouse house;
    CNewHouseCorp newHouseCorp(&house);
    newHouseCorp.MakeMoney();
    cout << endl;
 
    cout << "----------山寨公司是这样运行的----------" << endl;
    CIPod ipod;
    CShanZhaiCorp shanZhaiCorp(&ipod);
    shanZhaiCorp.MakeMoney();
    cout << endl;
}
 
int main()
{
    DoNewRun1();
 
    DoNewRun2();
    return 0;
}
 </code></pre>
 
这里我们要说明的是Java中我们可以使用super.func()的方式调用基类,在C++中,我们直接this->CNewCorp::MakeMoney();来调用基类

另外,我们要深刻理解动态绑定的灵活性!

 
客户直接使用CNewHouseCorp和CShanZhaiCorp类.

####在main()函数里构造产品,然后传到这两个类里。这两个类的MakeMoney()函数,先调用基类的MakeMoney(),然后分别执行各自的逻辑。各自逻辑就是子类的具体实现(concreteimplement)

 
参考[http://www.cnblogs.com/jiese/p/3164940.html](http://www.cnblogs.com/jiese/p/3164940.html)