设计模式 之 桥接模式

今天在讲桥接模式之前先了解合成/聚合原则,在桥接模式中主要思想是合成/聚合原则,抽象继承为辅。

合成/聚合复用原则(CARP):尽量使用合成/聚合,尽量不要使用类继承。

合成(Composition,也叫组合)和聚合(Aggregation)都是关联的特殊种类。聚合表示一种 的‘拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;合成则是一种 ‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的声明周期一样。
以大雁为例。一只大雁有两只翅膀,翅膀与大雁是部分与整体的关系,并且翅膀与大雁的生命周期相同,所以翅膀和大雁具有强拥有关系,属于合成关系。
大雁为群居动物,每只大雁属都是属于某一个雁群,而一个雁群可以有多只大雁,一只大雁与雁群之间存在弱拥有关系,所以大雁和雁群属于聚合关系。雁群、大雁、翅膀的结构图如下:
在这里插入图片描述合成/聚合复用原则的好处是优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

桥接模式(Bridge):将抽象部分与实现部分分离,使它们都可以独立地变化。

以手机为例,市面上存在很多手机品牌,每个手机品牌都有自己手机应用。想要使用代码实现对不同手机自身应用的使用,就会存在如下结构图:
按手机品牌分类实现结构图:
在这里插入图片描述若现在需要新增一个MP3的功能,手机品牌M,N都需要添加一个MP3的子类。有多少个手机品牌就需要多新增多少各MP3的子类,且MP3类的内容非常相似,代码的总量会成指数增长。
按软件分类实现结构图如下:
在这里插入图片描述同样以新增MP3功能为例,虽然只需要新增一个MP3类作为手机软件的子类,但是MP3类需要添加很多个手机品牌的MP3子类。
针对上面两种结构,对于新增手机类或应用时都会设计大量类的增加。可以使用桥接模式来解决,桥接模式将这些实现独立出来,让它们各自地变化。这样就使得没哦中实现的变化不会影响其他实现,从而达到应对变化的目的。使用桥接模式结构图如下:
在这里插入图片描述手机品牌通过手机软件抽象类聚合起来,通讯录、游戏等应用功能继承手机软件类,每新增一个功能,只需要添加一个手机软件子类即可。每增加一个手机品牌也只需要添加一个手机品牌子类即可。手机品牌和手机应用实现解耦,新增子类互不影响。

桥接模式的结构图下:
在这里插入图片描述

//Implementor类
class Implementor
{
public:
	virtual void Operation();
};
//ConcreteImplementorA和ConcreteImplementorB等派生类
class ConcreteImplementorA:public Implementor
{
public:
	void Operation()
	{
		cout<<"具体实现A的方法执行"}
};
class ConcreteImplementorB:public Implementor
{
public:
	void Operation()
	{
		cout<<"具体实现B的方法执行"}
};
//Abstraction类
class Abstraction
{
protected:
	Implementor implementor;
public:
	void SetImplementor(Implementor implementor)
	{
		this.implementor = implementor;
	}
	virtual void Operation()
	{
		implementor.Operation();
	}
};
//RefinedAbstraction类
class RefinedAbstraction: public Abstraction
{
public:
	void Operation()
	{
		implementor.Operation();
	}
};
//客户端实现
void main()
{
	Abstraction *ab = new RefinedAbstraction();
	ab.SetImplementor(new ConcreteImplementorA());
	ab.Operation();
	ab.SetImplementor(new ConcreteImplementorB());
	ab.Operation();
}

注意:开放-封闭原则不会修改原来的代码,只是扩展类即可,合成/聚合复用原则,也就是优先是哟那个对象的合成或聚合,而不是继承。
继承是一种强耦合的结构,父类变,子类就必须要变,一定要在是’is-a’的关系时再考虑使用,而不是任何时候都去使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值