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

桥接模式

时间:2014-05-25 21:24:35      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:c++ 设计模式

      桥接模式,将抽象部分与它的实现部分分离,使他们都可以独立的变化。
      抽象部分和实现部分不是指父类和子类,这里的抽象部分和实现部分是一种组合的关系。例如,燕子是抽象部分,燕子的翅膀是实现部分,燕子和燕子的翅膀就是一种组合的关系。桥接模式所应用的设计原则就是优先使用组合/聚合,而不是继承原则。
     优先使用组合/聚合而不是继承原则:
      因为任何父类的改变都会影响子类的行为,采用继承时,如果用户需求发生变化而造成父类进行修改,则所有的子类都要进行修改。而在使用组合时就降低了这种依赖关系。
对象的继承关系是在编译时就定义好的,无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。
优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
应用场景:
实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合性。
bubuko.com,布布扣
代码实现:
//Bridge.h
#include "stdafx.h"
#include <iostream>
using namespace std;

class Implement
{
public:
	virtual ~Implement(){}
	virtual void OperationImp() = 0;
};

class ConcreteImplementA:public Implement
{
public:
	virtual void OperationImp()
	{
		cout << "ConcreteImplementA" << endl;
	}
};

class ConcreteImplementB:public Implement
{
public:
	virtual void OperationImp()
	{
		cout << "ConcreteImplementB" << endl;
	}
};

class Abstraction
{
public:
	virtual ~Abstraction()
	{
		delete m_pImplement;
	}
	virtual void Operation() = 0;
	void SetImplement(Implement* implement)
	{
		m_pImplement = implement;
	}
	Implement* GetImplement()const
	{
		return m_pImplement;
	}
private:
	Implement* m_pImplement;
};

class RedefinedAbstraction :public Abstraction
{
public:
	virtual void Operation()
	{
		GetImplement()->OperationImp();
	}
};
// BridgePattern.cpp
#include "stdafx.h"
#include "Bridge.h"


int _tmain(int argc, _TCHAR* argv[])
{
	Abstraction* abstrastion = new RedefinedAbstraction();
	abstrastion->SetImplement(new ConcreteImplementA());
	abstrastion->Operation();

	abstrastion->SetImplement(new ConcreteImplementB());
	abstrastion->Operation();
	getchar();
	return 0;
}



桥接模式,布布扣,bubuko.com

桥接模式

标签:c++ 设计模式

原文地址:http://blog.csdn.net/wwwdongzi/article/details/26975475

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