设计模式(十八)桥接模式 C++

桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。

桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。

桥接模式号称是最难理解的模式,其实不然。“将抽象部分与它的实现部分分离”,意思是说实现系统可能会有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少之间的耦合。比如运行手机软件,手机有手机的分类,软件有软件的分类,那么就可以把手机和软件分离出来,让他们独立变化。

// 不要理解成抽象类和实现类分离

桥接模式涉及到了合成/聚合复用原则

合成/聚合复用原则是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的

 模式的结构

桥接(Bridge)模式包含以下主要角色。

  1. 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
  2. 扩展抽象化(Refined    Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  3. 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
  4. 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。

以手机软件为例

手机品牌 (HandsetBrand) 是抽象化(Abstraction)角色 

华为 (HandsetBrandHuaWei)和苹果(HandsetBrandiPhnoe)是拓展抽象化(Refined    Abstraction)角色

手机软件抽象类 (HandsetSoft)是实现化角色(Implementor)

游戏(HandsetGame)和通信录( HandsetAddressList)是具体实现化(Concrete Implementor)角色

然后抽象角色里面保存了实现化角色的指针,通过指针来进行多态的调用实现化角色。

下面是代码示范

#include <iostream>  
#include <string>  
using namespace std;

class HandsetSoft  //手机软件
{
public:
	virtual void run() = 0;
};

class HandsetGame :public HandsetSoft  //游戏软件
{
public:
	void run()
	{
		cout << "运行手机游戏" << endl;
	}
};

class HandsetAddressList :public HandsetSoft  //通讯录软件
{
public:
	void run()
	{
		cout << "运行手机通讯录" << endl;
	}
};

class HandsetBrand  //手机品牌
{
protected:
	HandsetSoft *soft;
public:
	void setHandsetSoft(HandsetSoft *soft)
	{
		this->soft = soft;
	}
	virtual void run() = 0;
};

class HandsetBrandHuaWei :public HandsetBrand  //N品牌
{
public:
	void run()
	{
		soft->run();
	}
};

class HandsetBrandiPhnoe :public HandsetBrand  //M品牌
{
public:
	void run()
	{
		soft->run();
	}
};

int main()
{
	HandsetBrand *pPhone;
	pPhone = new HandsetBrandHuaWei();

	pPhone->setHandsetSoft(new HandsetGame());
	pPhone->run();
	pPhone->setHandsetSoft(new HandsetAddressList());
	pPhone->run();

	cin.get();
	return 0;
}

关于合成聚用原则

一:合成/聚合复用原则

  尽量使用合成/聚合,尽量不要使用类继承

  二:什么是合成?

  合成表示一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样,打个比方:人有两个胳膊,胳膊和人就是部分和整体的关系,人去世了,那么胳膊也就没用了,也就是说胳膊和人的生命周期是相同的

  . 合成关系用实心的菱形+实线来表示

  三:什么是聚合?

  聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但是B对象并不是A对象的一部分,打个比方:人是群居动物,所以每个人属于一个人群,一个人群可以有多个人,所以人群和人是聚合的关系

  聚合关系用空心的菱形+实线来表示

  四:为什么尽量不要使用类继承而使用合成/聚合?

  . 对象的继承关系在编译时就定义好了,所以无法在运行时改变从父类继承的子类的实现

  . 子类的实现和它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化

  . 当你复用子类的时候,如果继承下来的实现不适合解决新的问题,则父类必须重写或者被其它更适合的类所替换

  这种依赖关系限制了灵活性,并最终限制了复用性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值