桥梁模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。
总结面向对象实际上就两句话:一是松耦合(Coupling),二是高内聚(Cohesion)。面向对象系统追求的目标就是尽可能地提高系统模块内部的内聚(Cohesion)、尽可能降低模块间的耦合(Coupling)。然而这也是面向对象设计过程中最为难把握的部分,大家肯定在OO 系统的开发过程中遇到这样的问题:
1)客户给了你一个需求,于是使用一个类来实现(A);
2)客户需求变化,有两个算法实现功能,于是改变设计,我们通过一个抽象的基类,再定义两个具体类实现两个不同的算法(A1 和 A2);
3)客户又告诉我们说对于不同的操作系统,于是再抽象一个层次,作为一个抽象基类A0,在分别为每个操作系统派生具体类(A00 和 A01,其中 A00 表示原来的类 A)实现不同操作系统上的客户需求,这样我们就有了一共 4 个类。
4)可能用户的需求又有变化,比如说又有了一种新的算法........5)我们陷入了一个需求变化的郁闷当中,也因此带来了类的迅速膨胀。Bridge 模式则正是解决了这类问题。
Bridge 模式典型的结构图为:
今天我要说说我自己,梦想中的我自己,我身价过亿,有两个大公司,一个是房地产公司,一个是服装制造业,这两个公司都很赚钱,天天帮我在累加财富,其实是什么公司我倒是不关心,我关心的是是不是在赚钱,赚 了多少,这才是我关心的,我是商人呀,唯利是图是我的本性,偷税漏税是我的方法,欺上瞒下、压榨员工血汗 我是的手段嘛,呵呵,同时我公司也 会发展,终于在有一天我觉得赚钱速度太慢,于是我上下疏通,左右打关系,终于开辟了一条赚钱的康庄大道:生产山寨产品,什么产品呢?就是市场上什么牌子的东西火爆我生产什么牌子的东西,甭管是打火机还是电脑,只要它火爆,我就生产,赚过了高峰期就换个产品,打一枪换一个牌子,不承担售后成本、也不担心销路问题,
我只有正品的十分之一的价格,你买不买?哈哈,赚钱呀!
那么,我的服装厂就开始变成山寨 iPod 生产车间,然后就看我的财富在积累积累,你想呀山寨的东西不需要特别的销售渠道(正品到哪里我就到哪里),不需要维修成本(大不了给你换个,你还想咋地,过了高峰期我就改头换面了你找谁维修去,投诉?投诉谁呢?),不承担广告成本(正品在打广告,我还需要吗?需要吗?),但是我也有犯愁的时候,我这是个山寨工厂,要及时的生产出市场上流行产品,转型要快,要灵活,今天从生产 iPod 转为生产 MP4,明天再转为生产上网本,这个都需要灵活的变化,不要限制的太死,那问题来了,每次我的厂房,我的工人,我的设备都在,不可能每次我换个山寨产品我的厂子就彻底不要了,这不行,成本忒高了点,那怎么办?请看类图:
CNewCorp 类和 IProduct 类建立一个关联关系,可以彻底解决我以后山寨公司生产产品的问题了。
注释:
main(),客户
IProduct,产品接口
CHouse,房子
CIPod,ipod
CClothes,服装
CNewCorp,桥梁类,MakeMoney()是桥梁方法
CNewHouseCorp,只能生产房子,所以构造函数是CHouse*
CShanZhaiCorp,什么赚钱就生产什么,所以构造函数是IProduct*
说明:客户直接使用CNewHouseCorp和CShanZhaiCorp类,在main()函数里构造产品,然后传到这两个类里。这两个类的MakeMoney()函数,先调用基类的MakeMoney(),然后分别执行各自的逻辑。
注意:CNewCorp起到了桥梁的作用。可以分别增加产品和公司。
产品接口类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.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.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.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.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.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.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