设计模式-结构-Bridge(桥接)模式

梦想游戏人
目录:
软件架构

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

在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式

实现和接口解耦,吧继承关系 改为组合关系,从而应对多个实现的变化需求,C++ Impl手法就是一个Bridge模式的实现方法

以下是一个场景

1)客户给了你一个需求,于是使用一个类来实现(A);

2)客户需求变化,有两个算法实现功能,于是改变设计,我们通过一个抽象的基类,再定义两个具体类实现两个不同的算法(A1和A2);

3)客户又告诉我们说对于不同的操作系统,于是再抽象一个层次,作为一个抽象基类A0,在分别为每个操作系统派生具体类(A00和A01,其中A00表示原来的类A)实现不同操作系统上的客户需求,这样我们就有了一共4个类。

4)可能用户的需求又有变化,比如说又有了一种新的算法……..

5)我们陷入了一个需求变化的郁闷当中,也因此带来了类的迅速膨胀。

Bridge模式则正是解决了这类问题。

例子1

class AbstractionImpl
{
public:
	virtual void Operation() = 0;


};

class AbstractionImplA :public AbstractionImpl
{
public:
	virtual void Operation()override
	{

		cout << "do Action" << endl;
	}


};

class Abstraction
{
public:
	virtual void Operation() = 0;

};





class RefinedAbstrantion :public Abstraction
{
public:
	virtual void Operation()override
	{
		impl->Operation();

	}
	RefinedAbstrantion(AbstractionImpl *impl)
	{
		this->impl = impl;

	}
private:
	AbstractionImpl *impl;

};








int main(int argc, char *argv[])
{

	AbstractionImpl *impl = new AbstractionImplA;
	Abstraction *abs = new RefinedAbstrantion(impl);

	abs->Operation();



	system("pause");
	return 0;
}
//达到了  多个变化的维度,而不是通过简单的继承

例2

玩家和武器系统

 

class Weapon
{
public:
	virtual void use() = 0;

};




class WeaponImpl
{
public:

	void use()
	{
		weapon->use();
	}
	WeaponImpl(Weapon* wea)
	{
		this->weapon = wea;
	}
private:
	Weapon * weapon;
};




class Gun :public Weapon
{
public:
	virtual void use()override
	{
		cout << "shoot" << endl;
	}


};


class Player
{
public:


	void EquipWeapon(WeaponImpl* weapon)
	{
		this->weaponImpl = weapon;
	}
	void useWeapon()
	{
		weaponImpl->use();
	}
private:

	WeaponImpl *weaponImpl;



};



int main(int argc, char *argv[])
{

	WeaponImpl* impl = new WeaponImpl(new Gun);
	Player *player = new Player;

	player->EquipWeapon(impl);

	player->useWeapon();

	return 0;
}
Scroll Up