将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
桥接(Bridge)模式的优点是: 由于抽象与实现分离,所以扩展能力强; 其实现细节对客户透明。
缺点是:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
在桥模式中,抽象({@link Weapon(武器)})和实现({@link enchancement(魔法)})有自己的类层次结构。可以在不影响客户端的情况下更改实现的接口。
在这个例子中,我们有两个类层次结构。一个是武器,另一个是附魔。我们可以很容易地将任何武器与任何附魔相结合。
public class App { private static final Logger LOGGER = LoggerFactory.getLogger(App.class); /** * Program entry point. * * @param args command line args */ public static void main(String[] args) { LOGGER.info("The knight receives an enchanted sword."); var enchantedSword = new Sword(new SoulEatingEnchantment()); enchantedSword.wield(); enchantedSword.swing(); enchantedSword.unwield(); LOGGER.info("The valkyrie receives an enchanted hammer."); var hammer = new Hammer(new FlyingEnchantment()); hammer.wield(); hammer.swing(); hammer.unwield(); } } /** * Enchantment. */ public interface Enchantment { void onActivate(); void apply(); void onDeactivate(); } /** * Weapon. */ public interface Weapon { void wield(); void swing(); void unwield(); Enchantment getEnchantment(); } /** * Sword. */ public class Sword implements Weapon { private static final Logger LOGGER = LoggerFactory.getLogger(Sword.class); private final Enchantment enchantment; public Sword(Enchantment enchantment) { this.enchantment = enchantment; } @Override public void wield() { LOGGER.info("The sword is wielded."); enchantment.onActivate(); } @Override public void swing() { LOGGER.info("The sword is swinged."); enchantment.apply(); } @Override public void unwield() { LOGGER.info("The sword is unwielded."); enchantment.onDeactivate(); } @Override public Enchantment getEnchantment() { return enchantment; } } /** * Hammer. */ public class Hammer implements Weapon { private static final Logger LOGGER = LoggerFactory.getLogger(Hammer.class); private final Enchantment enchantment; public Hammer(Enchantment enchantment) { this.enchantment = enchantment; } @Override public void wield() { LOGGER.info("The hammer is wielded."); enchantment.onActivate(); } @Override public void swing() { LOGGER.info("The hammer is swinged."); enchantment.apply(); } @Override public void unwield() { LOGGER.info("The hammer is unwielded."); enchantment.onDeactivate(); } @Override public Enchantment getEnchantment() { return enchantment; } } /** * FlyingEnchantment. */ public class FlyingEnchantment implements Enchantment { private static final Logger LOGGER = LoggerFactory.getLogger(FlyingEnchantment.class); @Override public void onActivate() { LOGGER.info("The item begins to glow faintly."); } @Override public void apply() { LOGGER.info("The item flies and strikes the enemies finally returning to owner's hand."); } @Override public void onDeactivate() { LOGGER.info("The item's glow fades."); } } /** * SoulEatingEnchantment. */ public class SoulEatingEnchantment implements Enchantment { private static final Logger LOGGER = LoggerFactory.getLogger(SoulEatingEnchantment.class); @Override public void onActivate() { LOGGER.info("The item spreads bloodlust."); } @Override public void apply() { LOGGER.info("The item eats the soul of enemies."); } @Override public void onDeactivate() { LOGGER.info("Bloodlust slowly disappears."); } }