情景
现在假设要定义一些图形,这些图形按形状可分为圆形、三角形,按颜色可分为红色图形,绿色图形。
直接了当的实现方式
根据上述描述分别根据形状、颜色分类
一共有四种图形(实现类):红色圆形,红色三角形,绿色圆形,绿色三角形
面对变化时: 当新增一种颜色时,每个形状都要新增对应一个实现类,假设有n种形状,m种颜色,需要实现n*m个类,太过繁琐。
解决思路: 将颜色作为一个属性组合到形状当中。
这时,新增一个颜色或形状时,只需要加对应的一个实现类。
桥接模式
GOF中的定义: 将抽象与实现分离,使得二者可以独立地变化。
上述情景中,“实现”指的是形状,“抽象”指的是颜色,二者分离之后,都可以独立变化而互不影响。
更通俗地来说,当一个群组能根据多个维度进行划分时,可选择其中的一个维度作为“实现”即载体,而将其他的维度作为“抽象”部分,嵌入到“实现”中。
- 抽象群组只负责新增抽象的内容(即颜色),红色、绿色都不是具体的图形。
- 实现群组(形状)中嵌入了抽象部分(颜色),形状+颜色定义的是具体的图形。
使用场景
桥接模式的定义虽然较难以理解,但是应用起来十分简单且顺理成章。
例如:角色与武器的实现
CharacterBase
public abstract CharacterBase{
/*
* properties
*/
private WeaponBase m_weapon;
public WeaponBase Weapon{
get{return m_weapon;}
set{
m_weapon = value;
m_weapon.owner = this;
}
}
//攻击
public override void Attack(CharacterBase target){
if(m_weapon != null){
m_weapon.Attack(target);
}
}
}
WeaponBase
public abstract WeaponBase{
/*
* properties
*/
public CharacterBase owner;
public abstract void Attack(CharacterBase target);
}