C++设计模式笔记——桥接模式

桥接模式

 如果类存在两个维度可以独立变化,我们可以将这两个维度分离开,从而使它们可以独自变化,独立扩展。这就是桥接模式要做的事。

下面的示例,将电脑和软件做了分离抽象,实现了电脑和软件可以独立变化的能力。

电脑内包含软件,电脑种类众多,软件种类同样众多。使用桥接模式把电脑与其中的软件桥接起来,把抽象概括起来。需要拓展时只需要添加具体的电脑和具体的软件类。

代码示例

#include <iostream>
class ISoftware  //软件抽象类
{
public:
	virtual void run() = 0;
};

class SoftwareGame : public ISoftware
{
public:
	void run()
	{
		std::cout << "游戏软件" << std::endl;
	}
};
class SoftwareWork : public ISoftware
{
public:
	void run()
	{
		std::cout << "干活软件" << std::endl;
	}
};


class Computer   //电脑抽象类,包含软件抽象类对象,具体软件的运行由具体对象去实现 
{
protected:
	ISoftware * m_software;
public:
	Computer() : m_software(nullptr) {}
	virtual ~Computer()
	{
		if (nullptr == m_software)
			delete m_software;
	}

	virtual void run() = 0;

	void setSoftware(Software *p)
	{
		m_software = p;
	}
};


class ComputerA : public Computer
{
public:
	void run()
	{
		std::cout << "ComputerA 电脑运行";
		m_software->run();
	}
};


class ComputerB : public Computer
{
public:
	void run()
	{
		std::cout << "ComputerB 电脑运行";
		m_software->run();
	}
};


int main()
{
	// 桥接模式
	Computer *pa = new ComputerA();
	pa->setSoftware(new SoftwareGame());
	pa->run();
	delete pa;

	Computer *pb = new ComputerB();
	pb->setSoftware(new SoftwareNote());
	pb->run();
	delete pb;

	getchar();
	return 0;
}


优点:

桥接模式可以灵活组合,用来取代多层继承关系,避免多层继承引起的子类爆炸式增长;
桥接模式提高了系统可扩展性,某个维度上需要扩展时,只需增加实现类接口或者具体实现类,不影响另一个维度,符合开闭原则。


缺点:

难以理解,维度关系建立在抽象类层Computer类;准确识别系统中的两个维度是应用桥接模式的难点。


适用场景: 

一个类存在多个独立变化的维度,可采用桥接模式。

猜你喜欢

转载自blog.csdn.net/panjunnn/article/details/109614124