說起橋接模式,大家可能會聯想到虛擬機中的橋接模式概念,在虛擬機中的橋接模式和設計模式中的橋接模式是完全兩個不同的東西,沒有可比性。只是在這裡稍加提及兩個概念而已。
橋接模式針對的應用目標是將一個對象中的實現功能部分和抽象部分從對象中進行分離出來。並且將抽象出來的兩個部分分別各自進行封裝成對象。總之,為了提高內聚度,降低模塊之間的耦合度而所做的努力都是值得的。但是,至於具體如何提高內聚,降低耦合是一個關鍵性的問題,如何把握還得看具體情況。
橋接模式也是一個為了提高程序中的各個部分的內聚而設計出來的,將一個對象中可以進行分離的部分進行抽離,然後再度進行封裝。以組合的方式以供調用,這樣的處理的好處就是直接的降低了程序的耦合度,同時,也是程序的結構更加清晰可見。當然,任何東西都不能夠適用於所有情況,如果一個對象中,抽象部分和實現部分本身之間的關聯並不是很密切,如果使用橋接模式的話,可能會增加它的復雜度,所以視情況而定。
先畫橋接模式的一個類圖,如下:
從上圖中可以看得出來,將抽象類和實現類都從原來對象中剝離出來,並且重新紛封裝成對象。同時,對象可以有多種的實現方式,從這個角度上來講,也間接的豐富了對象。
與之前的幾個重要的設計模式想比較而言,從理解程度上來講,要容易的多。例如之前的工廠模式、工廠方法模式等等,在理解和處理起來都不容易,尤其是像工廠模式和builder模式。
那麼,在什麼情況下用橋接模式比較合適呢??在學習面向對象的時候,我們會發現,通過組合方式來實現一些東西往往比通過繼承要來的更加方便。同時組合的數據耦合度很低。
就像是在一個汽車配件廠一樣,我們的一輛汽車是通過各個不同的配件來完成的,而且每一個配件都屬於汽車的一個部分,缺一不可。但是,在汽車出廠的最後一步,就是將汽車的各個部分進行裝配起來,最後送出。如果從橋接模式來看的話,其實就相當於將汽車的各個部分進行剝離,各自封裝成對象。例如:發動機系統,輪胎,車架等等。各自都進行各自對象的封裝設計。最後通過組合的方式,完成一個完整的汽車的裝配。
舉一個實際的應用例子吧。
[cpp]
#ifndef CAR_H_
#define CAR_H_
class motor;
//汽車的類
class Car
{
public:
voidsprit();
private:
motor *pmotor;
};
#endif
#include"Car.h"
#include "motor.h"
#include <iostream>
using namespace std;
void Car::sprit()
{
pmotor =newCarmoter;
pmotor->ApplyEnery();
cout<<"這是一輛汽車"<<endl;
}
#pragma once
//發動機系統
class motor
{
public:
motor(void);
~motor(void);
public:
//提供動力
virtualvoid ApplyEnery();
};
class Carmoter:publicmotor
{
public:
Carmoter(void);
~Carmoter();
public:
voidApplyEnery();
};
#include "motor.h"
#include <iostream>
using namespace std;
motor::motor(void)
{
}
motor::~motor(void)
{
}
void motor::ApplyEnery()
{
cout<<"發動機系統"<<endl;
}
void Carmoter::ApplyEnery()
{
cout<<"汽車發動機"<<endl;
}
Carmoter::Carmoter(void )
{
}
Carmoter::~Carmoter()
{
}
#include "Car.h"
#include "motor.h"
#include <iostream>
void main()
{
Car *m_car =newCar;
m_car->sprit();
}
#ifndef CAR_H_
#define CAR_H_
class motor;
//汽車的類
class Car
{
public:
voidsprit();
private:
motor *pmotor;
};
#endif
#include"Car.h"
#include "motor.h"
#include <iostream>
using namespace std;
void Car::sprit()
{
pmotor =newCarmoter;
pmotor->ApplyEnery();
cout<<"這是一輛汽車"<<endl;
}
#pragma once
//發動機系統
class motor
{
public:
motor(void);
~motor(void);
public:
//提供動力
virtualvoid ApplyEnery();
};
class Carmoter:publicmotor
{
public:
Carmoter(void);
~Carmoter();
public:
voidApplyEnery();
};
#include "motor.h"
#include <iostream>
using namespace std;
motor::motor(void)
{
}
motor::~motor(void)
{
}
void motor::ApplyEnery()
{
cout<<"發動機系統"<<endl;
}
void Carmoter::ApplyEnery()
{
cout<<"汽車發動機"<<endl;
}
Carmoter::Carmoter(void )
{
}
Carmoter::~Carmoter()
{
}
#include "Car.h"
#include "motor.h"
#include <iostream>
void main()
{
Car *m_car =newCar;
m_car->sprit();
}
最後的運行結果為:
橋接模式最大的好處,就是將一個對象中的某些可以單獨剝離的部分進行獨立的對象封裝,然後再以組合的方式來調用這個對象。
雖然,在給的使用建議上是說將對象的實現部分和抽象部分進行剝離。其實,我感覺,在很多情況下都使用到了這一模式。而不單單是對實現和抽象部分的剝離上。因為橋接模式能夠是一些對象的調用變得方便,故而在諸多的情況下都是可以進行 使用的。