博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

bridge 桥接模式

Posted on 2015-04-08 10:22  bw_0927  阅读(132)  评论(0)    收藏  举报

 作用:

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

    UML结构图:



    抽象基类:

    1)Abstraction:某个抽象类,它的实现方式由Implementor完成。

    2)Implementor:实现类的抽象基类,定义了实现Abastraction的基本操作,而它的派生类实现这些接口。

    接口函数:

    1)Implementor::OperationImpl:定义了为实现Abstraction需要的基本操作,由Implementor的派生类实现之,而在Abstraction::Operation函数中根据不同的指针多态调用这个函数。

    解析:

    Bridge用于将表示和实现解耦,两者可以独立的变化。在Abstraction类中维护一个Implementor类指针,需要采用不同的实现方式的时候只需要传入不同的Implementor派生类就可以了。

    Bridge的实现方式其实和Builder十分的相近,可以这么说:本质上是一样的,只是封装的东西不一样罢了。两者的实现都有如下的共同点:抽象出来一 个基类,这个基类里面定义了共有的一些行为,形成接口函数(对接口编程而不是对实现编程),这个接口函数在Buildier中是BuildePart函数 在Bridge中是OperationImpl函数;

其次,聚合一个基类的指针,如Builder模式中Director类聚合了一个Builder基类 的指针,而Brige模式中Abstraction类聚合了一个Implementor基类的指针(优先采用聚合而不是继承);而在使用的时候,都把对这 个类的使用封装在一个函数中,在Bridge中是封装在Director::Construct函数中,因为装配不同部分的过程是一致的,而在 Bridge模式中则是封装在Abstraction::Operation函数中,在这个函数中调用对应的 Implementor::OperationImpl函数。就两个模式而言,Builder封装了不同的生成组成部分的方式,而Bridge封装了不同 的实现方式。

 

 

=======================

 

http://blog.csdn.net/mafuli007/article/details/8193936

/*
	桥接模式:将抽象部分与它的实现部分相分离,他们可以独立变化。
	合成/聚合复用原则CARP原则:面向对象设计的一个重要原则:
		尽量使用合成/聚合,尽量不用使用类的继承
	优点:
	(1)分离抽象接口及其实现部分。 
	(2)桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则
	(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的
	个数非常庞大,桥接模式是比多继承方案更好的解决方法。 
	(3)桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都
	不需要修改原有系统。 
	(4)实现细节对客户透明,可以对用户隐藏实现细节。 

	应用举例:
		一个画板的形状可以是圆形的,正方形的,颜色可以是红色,绿色,
		那要求一个实现一个画板就可以采用桥接模式
	Created by Phoenix_FuliMa
*/

#include <iostream>
using namespace std;

class Implementor
{
public:
	virtual void Show() {}
};

class Implementor1:public Implementor
{
public:
	virtual void Show()
	{
		cout<<"Implementor1 is showing..."<<endl;
	}
};

class Implementor2: public Implementor
{
public:
	virtual void Show()
	{
		cout<<"Implementor2 is showing.."<<endl;
	}
};

class Abstractor
{
	Implementor *_implementor;
public:
	virtual void SetImplementor(Implementor* ot)
	{
		this->_implementor = ot;
	}
	virtual void operate()
	{
		_implementor->Show();
	}
};

class RefinedAbstractor:public Abstractor
{

};

int main()
{
	Implementor1 * im1 = new Implementor1();
	Implementor2 * im2 = new Implementor2();

	RefinedAbstractor *re = new RefinedAbstractor();
	re->SetImplementor(im1);
	re->operate();
	re->SetImplementor(im2);
	re->operate();

	delete im1;
	delete im2;
	delete re;
	
	system("pause");
	return 0;
}