结构模式-桥接模式

Posted lyt96

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构模式-桥接模式相关的知识,希望对你有一定的参考价值。

1. 什么是结构模式
设计模式中有三种模式,分别是:创建型模式,结构型模式,行为模式。

 

1.1三种模式的区别
创建型模式:创建对象的模式,抽象了实例化的过程。

结构型模式:解决怎么组装现有的类,设计他们的交互,从而达到实现一定的功能。

行为模式:描述了对象和类的模式,以及它们间的通信模式。

 

1.2 结构模式
从上面的概念,可以知道,结构模型是解决现有类的组装,设计他们的交互,达到实现一定的功能。

分别有:外观模式,组合模式,代理模式,装饰模式,适配哭,桥接器

 

2. 什么是桥接模式
桥接模式,就是把抽象部份与它的实现部分分离出来,使他们都可以独立变化。

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

 

这里涉及到三个概念:

a) 抽象化:把事物的共性抽离出来,形成抽象类的过程。

b) 实现化:对抽象化的类,给出具体的现实。

c) 解耦:将抽象和实现之间耦合解脱,强关联变为弱关性。继承关系变为关联关系。

 

桥接模式的主要用途:如果实现的系统是多维度,而且每个维度都会可能产生变化,那个把多维度分类给分离出来让他们独立的变化,减少他们的耦合。

 

3 桥接模式结构图
 

分析:

1. 这里分两个维度,左边为维度一,抽象类维度,右边为实现类维度。

2. 两个维度进一步抽象,上面为维度的抽象父类,下面为维度的实现类。

3. 两个维度为弱关联关系。非继承关系。

 

当修改左边维度时,不会影响到右边,修改右边维度时也不会影响到左右。因为两者是关联

 

角色分析:

Abstraction: 抽象类父类

RefinedAbstarction: 扩充抽象类

AbstractionImp: 实现类父类

ConcreteAbstraction:具体实现类

 

4 例子
想来想去,也没想到好的例子,网上例子有:汽车和路,状和颜色等例子,但都不是实现运用中的例子。最后我想到了个游戏中能用的例子。

对于桥接模式,其实就是有两个不同维度,且两个维度之前关系不大的功能,都可以用桥接模式。

 

例子:游戏中,有怪物,每个怪物身上都有不同的技能。

 

分析:

1. 怪有很多种,假设有MosterA, MosterB两种怪

2. 技能也有很多种,假设SkillA, SkillB, SkillC三种技能

3. 怪和技能两者的关系是弱关联的。相互独立的。因此适合用桥接模式。

 

代码实现:

// 抽象怪类

class  Moster

{

public :

Moster(Skill *skill){_skill = skill;}

virtual ~Moster(){};

virtual void doSkill() = 0;

private:

Skill * _skill;

};

// 怪A

class MosterA: public Moster

{

public :

MosterA(Skill *skill){_skill = skill};

void doSkill(){_skill->do();}

};

// 怪B

class MosterB: public Moster

{

public :

MosterB(Skill *skill){_skill = skill};

void doSkill(){_skill->do();}

};

 

// 技能父类

class  Skill

{

public:

virtual ~Skill(){}

virtual void do(){};

};

// 技能A

class  SkillA:public Skill

{

public:

~skillA(){}

void do(){cout << “skillA do”<<endl;}

};

// 技能B

class  SkillB:public Skill

{

public:

~skillB(){}

void do(){cout << “skillB do”<<endl;}

};

// 技能C

class  SkillC:public Skill

{

public:

~skillC(){}

void do(){cout << “skillC do”<<endl;}

};

 

// 使用

int main(int argc,char ** argv)

{

// 拥有A技能的怪A

Monster* monsterA = new MonsterA(new SkillA());

monsterA.doSkill();

// 拥有B技能的怪A

Monster* monsterA1 = new MonsterA(new SkillB());

monsterA1.doSkill();

// 拥有B技能的技B

Monster* monsterB = new MonsterB(new SkillB());

monsterB.doSkill();

return 0;

}

 

分析:

1. 怪和技能,是两个互不影响的两个维度,每个怪和技能都可两两组合,而无须写额外代码

2. 新增怪或新技能都不能影响到另一方。比如,新增一个怪无需修改技能,但支持了所有技能;新增一个技能,不用修改怪,但所有怪都支持了新的技能。这就是桥接模式的精华。

 

5桥接模式的运用场景
桥接模式的运用,只要支持下面几个条件都可使用:

1 系统功能分两个的可变维度(抽象和现实分离)

2 两个维度之前是相互独立的(类继承变为关联关系)

6总结
桥接模式,是比较复杂,也比较难理解的模式之一,但用处十分有优势。

难理解在于:怎么把抽象和实现分离,但理解运用场景的两个条件是很容易辩别的。

优化在于:如果一个系统中,把能使用桥接模式的功能分出来,将具有桥接模式非通好的扩展性,独立性,通用性,易维护性等特别。

 

视频地址:https://www.bilibili.com/video/BV1Ua4y1t77o/

以上是关于结构模式-桥接模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式(34)-----结构型模式-----桥接设计模式

[设计模式C++go]结构型模式:桥接模式

[设计模式C++go]结构型模式:桥接模式

[设计模式C++go]结构型模式:桥接模式

桥接模式(Bridge Pattern)

设计模式--Bridge(桥接模式)--结构型