桥接模式:解耦作用。
设想如果要剑,锤子等武器,我们至少需要2个武器类,但是如果我们的武器需要附上不同的魔法,如飞行、噬魂等,此时至少有如下两种设计方案:
•第一种设计方案是为每一种武器都提供一套各种魔法的版本。
•第二种设计方案是根据实际需要对武器和魔法进行组合。
明显我们需要第二种
public class App {
public static void main(String[] args) {
System.out.println("骑士获得一把魔法剑");
Sword enchantedSword=new Sword(new SoulEatingEnchantment());
enchantedSword.wield();
enchantedSword.swing();
enchantedSword.unwield();
System.out.println("战士获得一把魔法锤");
Hammer hammer=new Hammer(new FlyingEnchantment());
hammer.wield();
hammer.swing();
hammer.unwield();
}
}
public interface Enchantment {
void onActivate();
void apply();
void onDeactivate();
}
这里写代码片public interface Weapon {
void wield();
void swing();
void unwield();
Enchantment getEnchantment();
}
public class FlyingEnchantment implements Enchantment {
@Override
public void onActivate() {
System.out.println("The item begins to glow faintly");
}
@Override
public void apply() {
System.out.println("The item flies and strikes the enemies finally returning to owner's hand");
}
@Override
public void onDeactivate() {
System.out.println("The item's glow fades");
}
}
public class SoulEatingEnchantment implements Enchantment {
@Override
public void onActivate() {
System.out.println("The item spreads bloodlust");
}
@Override
public void apply() {
System.out.println("The item eats the soul of enemies");
}
@Override
public void onDeactivate() {
System.out.println("Bloodlust slowly disappears.");
}
}
public class Hammer implements Weapon {
private final Enchantment enchantment;
public Hammer(Enchantment enchantment){
this.enchantment=enchantment;
}
@Override
public void wield() {
System.out.println("The hammer is wielded.");
enchantment.onActivate();
}
@Override
public void swing() {
System.out.println("The hammer is swinged");
enchantment.apply();
}
@Override
public void unwield() {
System.out.println("the hammer is unwielded");
enchantment.onDeactivate();
}
@Override
public Enchantment getEnchantment() {
return enchantment;
}
}
public class Sword implements Weapon {
private final Enchantment enchantment;
public Sword(Enchantment enchantment){
this.enchantment=enchantment;
}
@Override
public void wield() {
System.out.println("The sword is wielded");
enchantment.onActivate();
}
@Override
public void swing() {
System.out.println("The sword is swinged");
enchantment.apply();
}
@Override
public void unwield() {
System.out.println("The sword is unwielded");
enchantment.onDeactivate();
}
@Override
public Enchantment getEnchantment() {
return enchantment;
}
}
这样解耦的好处就是当这些武器需要其他功能时可以直接再添加新功能而不受原先魔法的限制。