橋樑模式,將抽象部分與它的實現部分分離,使它們都可以獨立地變化。實現分離的辦法就是增加一個類,
11.1.解釋
main(),客戶
IProduct,產品介面
CHouse,房子
CIPod,ipod
CClothes,服裝
CNewCorp,橋樑類,MakeMoney()是橋樑方法
CNewHouseCorp,只能生產房子,所以建構函式是CHouse*
CShanZhaiCorp,什麼賺錢就生產什麼,所以建構函式是IProduct*
說明:客戶直接使用CNewHouseCorp和CShanZhaiCorp類,在main()函數裡構造產品,然後傳到這兩個類裡。這兩個類的MakeMoney()函數,先調用基類的MakeMoney(),然後分別執行各自的邏輯。
注意:CNewCorp起到了橋樑的作用。可以分別增加產品和公司。
看代碼:
//NewCorp.h
#pragma once
#include "IProduct.h"
class CNewCorp
{
public:
CNewCorp(IProduct *pproduct);
virtual ~CNewCorp(void);
void MakeMoney();
private:
IProduct *m_pProduct;
};
//NewCorp.cpp
#include "StdAfx.h"
#include "NewCorp.h"
CNewCorp::CNewCorp( IProduct *pproduct )
{
this->m_pProduct = pproduct;
}
CNewCorp::~CNewCorp(void)
{
}
void CNewCorp::MakeMoney()
{
//每個公司都是一樣,先生產
this->m_pProduct->BeProducted();
//然後銷售
this->m_pProduct->BeSelled();
}
//NewHouseCorp.h
#pragma once
#include "newcorp.h"
#include "House.h"
class CNewHouseCorp :
public CNewCorp
{
public:
CNewHouseCorp(CHouse *pHouse);
~CNewHouseCorp(void);
void MakeMoney();
};
//NewHouseCorp.cpp
#include "StdAfx.h"
#include "NewHouseCorp.h"
#include <iostream>
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
#pragma once
#include "newcorp.h"
#include "IProduct.h"
class CShanZhaiCorp :
public CNewCorp
{
public:
CShanZhaiCorp(IProduct *pproduct);
~CShanZhaiCorp(void);
void MakeMoney();
};
//ShanZhaiCorp.cpp
#include "StdAfx.h"
#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;
}
//IProduct.h
#pragma once
class IProduct
{
public:
IProduct(void)
{
}
virtual ~IProduct(void)
{
}
virtual void BeProducted() = 0;
virtual void BeSelled() = 0;
};
//House.h
#pragma once
#include "iproduct.h"
class CHouse :
public IProduct
{
public:
CHouse(void);
~CHouse(void);
void BeProducted();
void BeSelled();
};
//House.cpp
#include "StdAfx.h"
#include "House.h"
#include <iostream>
using std::cout;
using std::endl;
CHouse::CHouse(void)
{
}
CHouse::~CHouse(void)
{
}
void CHouse::BeProducted()
{
cout << "生產出的房子是這個樣子的..." << endl;
}
void CHouse::BeSelled()
{
cout << "生產出的房子賣出去了..." << endl;
}
//Clothes.h
#pragma once
#include "iproduct.h"
class CClothes :
public IProduct
{
public:
CClothes(void);
~CClothes(void);
void BeProducted();
void BeSelled();
};
//Clothes.cpp
#include "StdAfx.h"
#include "Clothes.h"
#include <iostream>
using std::cout;
using std::endl;
CClothes::CClothes(void)
{
}
CClothes::~CClothes(void)
{
}
void CClothes::BeProducted()
{
cout << "生產出的衣服是這個樣子的..." << endl;
}
void CClothes::BeSelled()
{
cout << "生產出的衣服賣出去了..." << endl;
}
//IPod.h
#pragma once
#include "iproduct.h"
class CIPod :
public IProduct
{
public:
CIPod(void);
~CIPod(void);
void BeProducted();
void BeSelled();
};
//IPod.cpp
#include "StdAfx.h"
#include "IPod.h"
#include <iostream>
using std::cout;
using std::endl;
CIPod::CIPod(void)
{
}
CIPod::~CIPod(void)
{
}
void CIPod::BeProducted()
{
cout << "生產出的ipod是這個樣子的..." << endl;
}
void CIPod::BeSelled()
{
cout << "生產出的ipod賣出去了..." << endl;
}
//
// Bridge.cpp : 定義控制台應用程式的進入點。
//
#include "stdafx.h"
#include "ClothesCorp.h"
#include "NewHouseCorp.h"
#include "Clothes.h"
#include "IPod.h"
#include "ShanZhaiCorp.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 _tmain(int argc, _TCHAR* argv[])
{
//只有兩家公司,一家是房地產公司,另一家公司是衣服賺錢就生產衣服
DoNewRun1();
//只有兩家公司,一家是房地產公司,另一家公司是ipod賺錢就生產ipod
DoNewRun2();
_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
_CrtDumpMemoryLeaks();
return 0;
}
橋樑模式(又可以稱做橋接模式)屬於結構型模式。CNewCorp實現了橋樑(橋接)的作用。