设计模式:桥接模式

桥接模式:

将抽象部分和它的实现部分分离,使它们都可以独立变化。

对外提供抽象的接口,隐瞒实现部分,抽象中调用的实现部分可以在今后的开发过程中,切换成别的实现部分。

举个例子,现在比如有5种类型的战士(Fighter),20种类型的武器(Weapon),如果我们采用从一个抽象的Fighter类派生出配备不同武器的战士的话,我们需要5*20=100种子类,这种方法非常不合理,因为如果我们想在抽象类种添加一个抽象方法的话,就必须对这100种子类进行重定义。

桥接模式适合解决这种问题,现在我们把战士和武器分离,各自实现,通过Fighter和Weapon的组合就可以得到想得到的种类。

如下面程序:

这里Fighter为抽象类,提供了抽象接口useWeapon()和一个指向Weapon对象的指针,然后通过Fighter的子类SeaFighter定义抽象接口useWeapon(),抽象接口useWeapon()调用Weapon中的实现接口Gun(),Gun()由其子类重新定义。这样就把抽象部分和实现部分离开。

#include<iostream>
using namespace std;
class Weapon{
	public:
		virtual void Gun()=0;
		virtual void Sword()=0;
};
class DerivedWeapon:public Weapon{
	public:
		void Gun(){
			cout<<"Use gun"<<endl;
		}
		void Sword(){
			cout<<"Use sword"<<endl;
		}
};
class Fighter{
	public:
		Fighter(Weapon* weapon):pmWeapon(weapon){}
		virtual void useWeapon()=0;
	protected:
		Weapon* pmWeapon;
};
class SeaFighter:public Fighter{
	public:
		SeaFighter(Weapon* weapon):Fighter(weapon){}
		virtual void useWeapon(){
			pmWeapon->Gun();//抽象部分调用实现部分 
		}	
};
class LandFighter:public Fighter{
	public:
		LandFighter(Weapon* weapon):Fighter(weapon){}
		virtual void useWeapon(){
			pmWeapon->Sword();//抽象部分调用实现部分  
		}	
};
int main(){
	Weapon* aWeapon=new DerivedWeapon;
	
	Fighter* seaFighter=new SeaFighter(aWeapon);
	seaFighter->useWeapon();
	
	Fighter* landFighter=new LandFighter(aWeapon);
	landFighter->useWeapon();
	
	delete aWeapon;aWeapon=NULL;
	delete seaFighter;seaFighter=NULL;
	delete landFighter;landFighter=NULL;
}


你可能感兴趣的:(设计模式,桥接模式)