码迷,mamicode.com
首页 > 其他好文 > 详细

【设计模式】桥接模式

时间:2014-08-08 09:42:10      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   os   io   2014   ar   cti   

桥接模式:把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。事物对象仅是一个抽象的概念。如“圆形”、“三角形”归于抽象的“形状”之下,而“画圆”、“画三角”归于实现行为的“画图”类之下,然后由“形状”调用“画图”。“形状”成为一个继承体系,“画图”成为另一个继承体系,抽象和实现两者的关系为聚合关系。UML图如下:

bubuko.com,布布扣

  • Abstraction定义抽象的接口,该接口包含实现具体行为、具体特征的Implementor接口
  • Refined Abstraction:抽象接口Abstraction的子类,依旧是一个抽象的事物名
  • Implementor定义具体行为、具体特征的应用接口
  • ConcreteImplementor实现Implementor接口

下面是用C++描述的桥接模式的框架:
#include <iostream>
#include <string>

using namespace std;

// 实现
class Implementor {
public:
	virtual void Operation() = 0;
};

// 具体实现A
class ConcreteImplementorA : public Implementor {
public:
	void Operation()
	{
		cout << "执行具体实现A中的方法" << endl;
	}
};

// 具体实现B
class ConcreteImplementorB : public Implementor {
public:
	void Operation()
	{
		cout << "执行具体实现B中的方法" << endl;
	}
};

// 抽象
class Abstraction {
public:
	void SetImplementor(Implementor *i)
	{
		implementor = i;
	}

	virtual void Operation() = 0;

	~Abstraction()
	{
		delete implementor;
	}
protected:
	Implementor *implementor;	// 包含一个实现
};

// 被提炼的抽象
class RefineAbstraction : public Abstraction {
public:
	void Operation()
	{
		implementor->Operation();
	}
};

int main()
{
	Abstraction *ab = new RefineAbstraction();

	ab->SetImplementor(new ConcreteImplementorA());
	ab->Operation();

	ab->SetImplementor(new ConcreteImplementorB());
	ab->Operation();
	
	// 别忘记删除指针
	delete ab;

	system("pause");
	return 0;
}

运行结果:
bubuko.com,布布扣

上面的例子实现了抽象Abstraction和实现Implementor分离,抽象中包含实现。但具体是哪种实现(ConcreteImplementorA或ConcreteImplementorB)是由客户端决定的。当需要添加抽象时,只需要继承Abstraction即可;当需要添加具体实现时,继承Implementor即可。这样既降低了耦合度,也符合开放-封闭原则,即:功能的扩充不需要修改原来的代码而只需要添加所需新的代码。

参考:
《大话设计模式》第22章
维基百科

【设计模式】桥接模式,布布扣,bubuko.com

【设计模式】桥接模式

标签:style   blog   http   os   io   2014   ar   cti   

原文地址:http://blog.csdn.net/nestler/article/details/38433999

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!