C++桥接模式(Bridge)

UML类图(仅供参考)如下:

桥接模式解决的问题:

抽象类之间为聚合关系,将抽象部分与实现部分分离,使它们都可以独立的变化,这样他们的子类就可以任意聚合在一起

源码

#include <iostream>

// 抽象类,桥的一部分
class CAbstractionImplement
{
public:
	virtual ~CAbstractionImplement() {}

	// 定义接口,表示该类所支持的操作
	virtual void Operation() = 0;

protected:
	CAbstractionImplement() {}
};

// 具体实现A
class CConcreteAbstractionImplementA :public CAbstractionImplement
{
public:
	virtual void Operation()
	{
		std::cout << "CConcreteAbstractionImplementA::Operation" << std::endl;
	}
};

// 具体实现B
class CConcreteAbstractionImplementB :public CAbstractionImplement
{
public:
	virtual void Operation()
	{
		std::cout << "CConcreteAbstractionImplementB::Operation" << std::endl;
	}
};

// 抽象类,桥的另一部分
class CAbstraction
{
public:
	virtual ~CAbstraction() {}

	// 定义接口,表示该类所支持的操作
	virtual void Operation() = 0;

protected:

	CAbstraction(CAbstractionImplement* imp) :_imp(imp) {}

	// CAbstraction与CAbstractionImplement为聚合
	// 这样他们的子类可以以任何方式组合,从而实现桥接模式
	CAbstractionImplement *_imp;
};

// 具体实现A
class CRefinedAbstractionA :public CAbstraction
{
public:
	CRefinedAbstractionA(CAbstractionImplement* imp) :CAbstraction(imp) {}

	virtual void Operation()
	{
		std::cout << "CRefinedAbstractionA::Operation" << std::endl;
		this->_imp->Operation();
	}
};

// 具体实现A
class CRefinedAbstractionB :public CAbstraction
{
public:
	CRefinedAbstractionB(CAbstractionImplement* imp) :CAbstraction(imp) {}

	virtual void Operation()
	{
		std::cout << "CRefinedAbstractionB::Operation" << std::endl;
		this->_imp->Operation();
	}
};

// 测试
int main()
{
	CAbstractionImplement* imp = new CConcreteAbstractionImplementA();
	CAbstraction* abs = new CRefinedAbstractionA(imp);
	abs->Operation();

	std::cout << "-----------------------------------------" << std::endl;

	CAbstractionImplement* imp1 = new CConcreteAbstractionImplementB();
	CAbstraction* abs1 = new CRefinedAbstractionA(imp1);
	abs1->Operation();

	std::cout << "-----------------------------------------" << std::endl;

	CAbstractionImplement* imp2 = new CConcreteAbstractionImplementA();
	CAbstraction* abs2 = new CRefinedAbstractionB(imp2);		
	abs2->Operation();

	std::cout << "-----------------------------------------" << std::endl;

	CAbstractionImplement* imp3 = new CConcreteAbstractionImplementB();
	CAbstraction* abs3 = new CRefinedAbstractionB(imp3);
	abs3->Operation();
}

好处

1、抽象和实现的分离。

2、优秀的扩展能力。

3、实现细节对客户透明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值