设计模式(c++)笔记之六(Bridge模式)

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


一、描述:


      总结面向对象实际上就两句话:一是松耦合(Coupling),二是高内聚(Cohesion)。面向对象系统追求的目标就是尽可能地提高系统模块内部的内聚(Cohesion)、尽可能降低模块间的耦合(Coupling)。然而这也是面向对象设计过程中最为难把握的部分,大家肯定在OO 系统的开发过程中遇到这样的问题:

1)客户给了你一个需求,于是使用一个类来实现(A);

2)客户需求变化,有两个算法实现功能,于是改变设计,我们通过一个抽象的基类,再定义两个具体类实现两个不同的算法(A1 和 A2);

3)客户又告诉我们说对于不同的操作系统,于是再抽象一个层次,作为一个抽象基类A0,在分别为每个操作系统派生具体类(A00 和 A01,其中 A00 表示原来的类 A)实现不同操作系统上的客户需求,这样我们就有了一共 4 个类。

4)可能用户的需求又有变化,比如说又有了一种新的算法........5)我们陷入了一个需求变化的郁闷当中,也因此带来了类的迅速膨胀。Bridge 模式则正是解决了这类问题。 


      Bridge 模式典型的结构图为: 


图 2-1:Bridge Pattern 结构图

      在 Bridge 模式的结构图中可以看到,系统被分为两个相对独立的部分,左边是抽象部分,右边是实现部分,这两个部分可以互相独立地进行修改:例如上面问题中的客户需求变化,当用户需求需要从 Abstraction 派生一个具体子类时候,并不需要像上面通过继承方式实现时候需要添加子类 A1 和 A2 了。另外当上面问题中由于算法添加也只用改变右边实现(添加一个具体化子类),而右边不用在变化,也不用添加具体子类了 。


二、实例


1.描述:


      今天我要说说我自己,梦想中的我自己,我身价过亿,有两个大公司,一个是房地产公司,一个是服装制造业,这两个公司都很赚钱,天天帮我在累加财富,其实是什么公司我倒是不关心,我关心的是是不是在赚钱,赚 了多少,这才是我关心的,我是商人呀,唯利是图是我的本性,偷税漏税是我的方法,欺上瞒下、压榨员工血汗 我是的手段嘛,呵呵,同时我公司也 会发展,终于在有一天我觉得赚钱速度太慢,于是我上下疏通,左右打关系,终于开辟了一条赚钱的康庄大道:生产山寨产品,什么产品呢?就是市场上什么牌子的东西火爆我生产什么牌子的东西,甭管是打火机还是电脑,只要它火爆,我就生产,赚过了高峰期就换个产品,打一枪换一个牌子,不承担售后成本、也不担心销路问题,
我只有正品的十分之一的价格,你买不买?哈哈,赚钱呀! 
      那么,我的服装厂就开始变成山寨 iPod 生产车间,然后就看我的财富在积累积累,你想呀山寨的东西不需要特别的销售渠道(正品到哪里我就到哪里),不需要维修成本(大不了给你换个,你还想咋地,过了高峰期我就改头换面了你找谁维修去,投诉?投诉谁呢?),不承担广告成本(正品在打广告,我还需要吗?需要吗?),但是我也有犯愁的时候,我这是个山寨工厂,要及时的生产出市场上流行产品,转型要快,要灵活,今天从生产 iPod 转为生产 MP4,明天再转为生产上网本,这个都需要灵活的变化,不要限制的太死,那问题来了,每次我的厂房,我的工人,我的设备都在,不可能每次我换个山寨产品我的厂子就彻底不要了,这不行,成本忒高了点,那怎么办?请看类图:



CNewCorp 类和 IProduct 类建立一个关联关系,可以彻底解决我以后山寨公司生产产品的问题了。


注释:

      main(),客户

      IProduct,产品接口

      CHouse,房子

      CIPod,ipod

      CClothes,服装

      CNewCorp,桥梁类,MakeMoney()是桥梁方法

      CNewHouseCorp,只能生产房子,所以构造函数是CHouse*

      CShanZhaiCorp,什么赚钱就生产什么,所以构造函数是IProduct*

      说明:客户直接使用CNewHouseCorp和CShanZhaiCorp类,在main()函数里构造产品,然后传到这两个类里。这两个类的MakeMoney()函数,先调用基类的MakeMoney(),然后分别执行各自的逻辑。

      注意:CNewCorp起到了桥梁的作用。可以分别增加产品和公司。


2.我的工程目录


      


3.代码

产品接口类IProduct

IProduct.h

#ifndef __Bridge__IProduct__
#define __Bridge__IProduct__

#include <iostream>
class IProduct
{
public:
    IProduct(void){}
    virtual ~IProduct(void){}
    virtual void BeProducted() = 0;
    virtual void BeSelled() = 0;
    
};

#endif /* defined(__Bridge__IProduct__) */

房子类 House

House.h

#ifndef __Bridge__House__
#define __Bridge__House__

#include <iostream>
#include "IProduct.h"
class CHouse:public IProduct
{
public:
    CHouse(void);
    ~CHouse(void);
    void BeProducted();
    void BeSelled() ;
};

#endif /* defined(__Bridge__House__) */
House.cpp

#include "House.h"
using std::cout;
using std::endl;
CHouse::CHouse(void){}
CHouse::~CHouse(void){}

void CHouse::BeProducted()
{
    cout << "生产出的房子是这个样子的..." << endl;
}

void CHouse::BeSelled()
{
    cout << "生产出的房子卖出去了..." << endl; 
}

服装类 Clothes

Clothes.h

#ifndef __Bridge__Clothes__
#define __Bridge__Clothes__

#include <iostream>
#include "IProduct.h"

class CClothes :
public IProduct
{
public:
    CClothes(void);
    ~CClothes(void);
    void BeProducted();
    void BeSelled();
};

#endif /* defined(__Bridge__Clothes__) */
Clothes.cpp

#include "Clothes.h"
using std::cout;
using std::endl;
CClothes::CClothes(void)
{
}
CClothes::~CClothes(void)
{
}
void CClothes::BeProducted()
{
    cout << "生产出的衣服是这个样子的..." << endl;
}
void CClothes::BeSelled()
{
    cout << "生产出的衣服卖出去了..." << endl;
}

ipod类 IPod

IPod.h

#ifndef __Bridge__IPod__
#define __Bridge__IPod__

#include <iostream>

#include "IProduct.h"
class CIPod :
public IProduct
{
public:
    CIPod(void);
    ~CIPod(void);
    void BeProducted();
    void BeSelled();
};

#endif /* defined(__Bridge__IPod__) */
IPod.cpp

#include "IPod.h"
using std::cout;
using std::endl;
CIPod::CIPod(void)
{
}
CIPod::~CIPod(void)
{
}
void CIPod::BeProducted()
{
    cout << "生产出的ipod是这个样子的..." << endl;
}
void CIPod::BeSelled()
{
    cout << "生产出的ipod卖出去了..." << endl;
}

桥梁类 NewCorp

NewCorp.h

#ifndef __Bridge__NewCorp__
#define __Bridge__NewCorp__

#include <iostream>
#include "IProduct.h"
class CNewCorp
{
public:
    CNewCorp(IProduct *pproduct);
    virtual ~CNewCorp(void);
    void MakeMoney();
private:
    IProduct *m_pProduct;
};

#endif /* defined(__Bridge__NewCorp__) */
NewCorp.cpp

#include "NewCorp.h"

CNewCorp::CNewCorp(IProduct *pproduct)
{
    this->m_pProduct= pproduct;
}

CNewCorp::~CNewCorp()
{
    
}

void CNewCorp::MakeMoney()
{
    //每个公司都是一样,先生产
    this->m_pProduct->BeProducted();
    
    //然后销售
    this->m_pProduct->BeSelled();
}

房地产公司类 NewHouseCorp

NewHouseCorp.h

#ifndef __Bridge__NewHouseCorp__
#define __Bridge__NewHouseCorp__

#include <iostream>
#include "NewCorp.h"
#include "House.h"

class CNewHouseCorp:public CNewCorp {
    
    
public:
    CNewHouseCorp(CHouse *pHouse);
    ~CNewHouseCorp(void);
    void MakeMoney();
};

#endif /* defined(__Bridge__NewHouseCorp__) */
NewHouseCorp.cpp

#include "NewHouseCorp.h"
using std::cout;
using std::endl;

CNewHouseCorp::CNewHouseCorp(CHouse *pHouse) : CNewCorp(pHouse)
{
}
CNewHouseCorp::~CNewHouseCorp(void)
{
}
void CNewHouseCorp::MakeMoney()
{
    this->CNewCorp::MakeMoney();
    cout << "房地产公司赚大钱了..." << endl;
}

山寨公司类  ShanZhaiCorp

ShanZhaiCorp.h

#ifndef __Bridge__ShanZhaiCorp__
#define __Bridge__ShanZhaiCorp__

#include <iostream>
#include "NewCorp.h"
#include "IProduct.h"

class CShanZhaiCorp:public CNewCorp
{
public:
    CShanZhaiCorp(IProduct *pproduct);
    ~CShanZhaiCorp(void);
    void MakeMoney();
};

#endif /* defined(__Bridge__ShanZhaiCorp__) */
ShanZhaiCorp.cpp

#include "ShanZhaiCorp.h"
#include <iostream>
using std::cout;
using std::endl;
CShanZhaiCorp::CShanZhaiCorp(IProduct *pproduct) : CNewCorp(pproduct)
{
}
CShanZhaiCorp::~CShanZhaiCorp(void)
{
}
void CShanZhaiCorp::MakeMoney()
{
    this->CNewCorp::MakeMoney();
    cout << "我赚钱呀..." << endl;
}

测试代码:

main.cpp

#include <stdio.h>
#include "NewCorp.h"
#include "NewHouseCorp.h"
#include "ShanZhaiCorp.h"

#include "Clothes.h"
#include "IPod.h"
#include "House.h"

#include <iostream>
using std::cout;
using std::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(int argc, const char * argv[])
{
    DoNewRun1();
    DoNewRun2();
    // insert code here...
    printf("Hello, World!\n");
    return 0;
}

结果如下:




参考文献:《设计模式之禅》,《GoF_23种设计模式解析》

参考博客:http://www.cnblogs.com/wanggary/archive/2011/04/17/2019067.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值