目錄
1、Bridge模式的提出
2、Bridge模式的定義
3、Bridge模式總結(jié)
4、需求描述
5、多繼承方式實(shí)現(xiàn)
6、使用Bridge設(shè)計(jì)模式實(shí)現(xiàn)
1、Bridge模式的提出
? ? ? ? 在軟件功能模塊設(shè)計(jì)中,如果類(lèi)的實(shí)現(xiàn)功能劃分不清晰,使得繼承得到的子類(lèi)往往是隨著需求的變化,子類(lèi)急劇膨脹,充斥重復(fù)代碼。將類(lèi)要實(shí)現(xiàn)功能劃分清楚是設(shè)計(jì)較好軟件框架的關(guān)鍵。
2、Bridge模式的定義
? ? ? ? 對(duì)于類(lèi)的實(shí)現(xiàn)功能具有兩個(gè)變化的維度,甚至由多個(gè)維度的變化,使用類(lèi)的多繼承實(shí)現(xiàn)方式,會(huì)使子類(lèi)數(shù)目急劇膨脹。Bridge模式使用“對(duì)象間的組合關(guān)系”解耦抽象和實(shí)現(xiàn)之間固有的綁定關(guān)系,使得抽象和實(shí)現(xiàn)可以沿著各自的維度變化,即將不同的維度分別進(jìn)行抽象,然后各自根據(jù)變化維度進(jìn)行繼承。
3、Bridge模式總結(jié)
? ? ? ? Bridge模式的應(yīng)用一般在“兩個(gè)非常強(qiáng)的變化維度”,有時(shí)一個(gè)類(lèi)甚至有多個(gè)變化的維度,這時(shí)使用Bridge模式的擴(kuò)展模式來(lái)設(shè)計(jì)代碼。
4、需求描述
手機(jī)有固有屬性(材料、顏色、攝像頭個(gè)數(shù))和軟件屬性(開(kāi)機(jī)動(dòng)畫(huà)、網(wǎng)絡(luò)打印、支持app數(shù)目)。有2款A(yù)、B類(lèi)型手機(jī),A、B分別繼承手機(jī)的固有屬性功能。在A款基礎(chǔ)上又有2款Higher、Pro類(lèi)型,Higher、Pro分別繼承手機(jī)的軟件功能;在B款的基礎(chǔ)上也有2種Higher、Pro,這2種也分別繼承手機(jī)的軟件功能。
5、多繼承方式實(shí)現(xiàn)
#include <iostream>
class MobilePhone
{
public:
//手機(jī)材質(zhì)
virtual void PhoneMaterial()=0;
//手機(jī)顏色
virtual void PhoneColor()=0;
//手機(jī)大小
virtual void PhoneCameNum()=0;
//開(kāi)機(jī)動(dòng)畫(huà)
virtual void BootAnimation()=0;
//網(wǎng)絡(luò)打印類(lèi)型
virtual void NetPrintType()=0;
//軟件支持?jǐn)?shù)目
virtual void SoftSuppotNum()=0;
virtual ~MobilePhone(){
};
};
//下面的類(lèi)繼承關(guān)系中,不同層級(jí)的類(lèi)繼承不同抽象函數(shù),可以分函數(shù)抽象一個(gè)類(lèi),見(jiàn)Bridge模式。
class APhoneNoraml:public MobilePhone
{
public:
virtual ~APhoneNoraml(){};
virtual void PhoneMaterial()override{
std::cout << "Glass material" << std::endl;
};
virtual void PhoneColor()override{
std::cout << "2 Colors" << std::endl;
};
virtual void PhoneCameNum()override{
std::cout << "2 CamNum" << std::endl;
};
};
class BPhoneNoraml:public MobilePhone
{
public:
virtual ~BPhoneNoraml(){};
virtual void PhoneMaterial()override{
std::cout << "Glass material" << std::endl;
};
virtual void PhoneColor()override{
std::cout << "3 Colors" << std::endl;
};
virtual void PhoneCameNum()override{
std::cout << "3 CamNum" << std::endl;
};
};
class APhoneHiger:public APhoneNoraml
{
public:
virtual ~APhoneHiger(){};
virtual void BootAnimation()override{
APhoneNoraml::PhoneMaterial();
APhoneNoraml::PhoneColor();
APhoneNoraml::PhoneCameNum();
std::cout << "good luck" << std::endl;
};
virtual void NetPrintType()override{
std::cout << "Support base txt type" << std::endl;
};
virtual void SoftSuppotNum()override{
std::cout << "Support 20 app" << std::endl;
};
};
class BPhoneHiger:public BPhoneNoraml
{
public:
virtual ~BPhoneHiger(){};
virtual void BootAnimation()override{
BPhoneNoraml::PhoneMaterial();
BPhoneNoraml::PhoneColor();
BPhoneNoraml::PhoneCameNum();
std::cout << "gook lunck" << std::endl;
};
virtual void NetPrintType()override{
std::cout << "Support base txt type" << std::endl;
};
virtual void SoftSuppotNum()override{
std::cout << "Support 20 app" << std::endl;
};
};
class APhonePro:public APhoneNoraml
{
public:
virtual ~APhonePro(){};
virtual void BootAnimation()override{
APhoneNoraml::PhoneMaterial();
APhoneNoraml::PhoneColor();
APhoneNoraml::PhoneCameNum();
std::cout << "best wishes" << std::endl;
};
virtual void NetPrintType()override{
std::cout << "Support base 3 type" << std::endl;
};
virtual void SoftSuppotNum()override{
std::cout << "Support 30 app" << std::endl;
};
};
class BPhonePro:public BPhoneNoraml
{
public:
virtual ~BPhonePro(){};
virtual void BootAnimation()override{
BPhoneNoraml::PhoneMaterial();
BPhoneNoraml::PhoneColor();
BPhoneNoraml::PhoneCameNum();
std::cout << "best wishes" << std::endl;
};
virtual void NetPrintType()override{
std::cout << "Support base 3 type" << std::endl;
};
virtual void SoftSuppotNum()override{
std::cout << "Support 30 app" << std::endl;
};
};
int main()
{
MobilePhone* higherA = new APhoneHiger();
higherA->BootAnimation();
higherA->NetPrintType();
higherA->SoftSuppotNum();
delete higherA;
higherA = nullptr;
MobilePhone* proA = new APhonePro();
proA->BootAnimation();
proA->NetPrintType();
proA->SoftSuppotNum();
delete proA;
proA = nullptr;
return 0;
}
運(yùn)行結(jié)果如下:
6、使用Bridge設(shè)計(jì)模式實(shí)現(xiàn)
#include <iostream>
//將第一個(gè)變化維度的三個(gè)函數(shù)抽象成一個(gè)類(lèi),供第二層繼承使用
class MobilePhone
{
public:
//手機(jī)材質(zhì)
virtual void PhoneMaterial()=0;
//手機(jī)顏色
virtual void PhoneColor()=0;
//手機(jī)大小
virtual void PhoneCameNum()=0;
virtual ~MobilePhone(){}
};
//將第二個(gè)變化維度的三個(gè)函數(shù)抽象出一個(gè)類(lèi),供第三層繼承使用
class MobileSoft
{
public:
MobileSoft(MobilePhone* p):Imp(p){};
MobilePhone *Imp;
//開(kāi)機(jī)動(dòng)畫(huà)
virtual void BootAnimation()=0;
//網(wǎng)絡(luò)打印類(lèi)型
virtual void NetPrintType()=0;
//軟件支持?jǐn)?shù)目
virtual void SoftSuppotNum()=0;
};
class APhoneNoraml:public MobilePhone
{
public:
virtual ~APhoneNoraml(){};
virtual void PhoneMaterial()override{
std::cout << "Glass material" << std::endl;
};
virtual void PhoneColor()override{
std::cout << "2 Colors" << std::endl;
};
virtual void PhoneCameNum()override{
std::cout << "2 CamNum" << std::endl;
};
};
class BPhoneNoraml:public MobilePhone
{
public:
virtual ~BPhoneNoraml(){};
virtual void PhoneMaterial()override{
std::cout << "Glass material" << std::endl;
};
virtual void PhoneColor()override{
std::cout << "3 Colors" << std::endl;
};
virtual void PhoneCameNum()override{
std::cout << "3 CamNum" << std::endl;
};
};
//在第三層繼承關(guān)系處使用對(duì)象組合。
class PhoneHiger:public MobileSoft
{
public:
PhoneHiger(MobilePhone *p):MobileSoft(p){};
virtual ~PhoneHiger(){};
virtual void BootAnimation()override{
Imp->PhoneMaterial();
Imp->PhoneColor();
Imp->PhoneCameNum();
std::cout << "good luck" << std::endl;
};
virtual void NetPrintType()override{
std::cout << "Support base txt type" << std::endl;
};
virtual void SoftSuppotNum()override{
std::cout << "Support 20 app" << std::endl;
};
};
class PhonePro:public MobileSoft
{
public:
PhonePro(MobilePhone *p):MobileSoft(p){};
virtual ~PhonePro(){};
virtual void BootAnimation()override{
Imp->PhoneMaterial();
Imp->PhoneColor();
Imp->PhoneCameNum();
std::cout << "best wishes" << std::endl;
};
virtual void NetPrintType()override{
std::cout << "Support base 3 type" << std::endl;
};
virtual void SoftSuppotNum()override{
std::cout << "Support 30 app" << std::endl;
};
};
int main()
{
std::cout << " ************** PhoneHiger ************** " << std::endl;
MobilePhone *normalA = new APhoneNoraml();
MobileSoft *higherA = new PhoneHiger(normalA);
higherA->BootAnimation();
higherA->NetPrintType();
higherA->SoftSuppotNum();
std::cout << "\n ************** PhonePro ************** " << std::endl;
MobilePhone *normalPro = new APhoneNoraml();
MobileSoft *proA = new PhonePro(normalPro);
proA->BootAnimation();
proA->NetPrintType();
proA->SoftSuppotNum();
return 0;
}
運(yùn)行結(jié)果如下:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-637309.html
? ? ? ?上面的代碼將不同的變化維度分別抽象成一個(gè)類(lèi),供子類(lèi)繼承;并且其中一個(gè)維度的繼承關(guān)系用“類(lèi)成員是基類(lèi)對(duì)象”組合的方式進(jìn)行替代,使功能類(lèi)代碼具有良好的擴(kuò)展性,也遵循單一職責(zé)原則。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-637309.html
到了這里,關(guān)于設(shè)計(jì)模式之Bridge模式的C++實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!