暴雪公司著名的游戏暗黑破坏神中,有一个经典的"镶嵌系统",例如,可以为武器镶嵌红宝石、蓝宝石来得到攻击特效或攻击力加成,为防具镶嵌红宝石、蓝宝石来得到攻击特效或者防御力的加成。不同的宝石加在不同的装备上会有不同效果,如宝石加在武器上则提升武器攻击力,加在防具上则提升防御力。
假设我们建立了一个剑类(Sword)和一个盾类(Shield),建立了一个红宝石类(Ruby)和一个蓝宝石类(Sapphire)。由于装备可以镶嵌宝石,那么这两个部分是可以两两组合的,为此,我们必须要写出4个类来表示它们的全部组合: SwordWithRuby, SwordWithSapphire, ShieldWithRuby, ShieldWithSapphire,代码编写十分繁琐。产生这种情况的原因是,“装备镶嵌宝石”存在这两个维度的变化(武器种类,宝石种类),假设有n种武器,m种宝石,为了实现这个机制,我们不得不构造m * n个类。
这个时候,我们可以用桥接模式来进行设计。
桥接模式的意图是将抽象部分与它的实现部分分离,使它们可以独立变化。在镶嵌系统中,抽象部分是什么?抽象部分就是武器镶嵌宝石的一个抽象类(EquipmentRubyBridge);实现部分是什么?实现部分是每种宝石的效果(Jewel)。代码如下:
interface Jewel {
String name() ;
}
class Ruby implements Jewel {
public String name (){
return "红宝石";
}
}
c