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