# æ¡¥æ¥æ¨¡å¼ ( Bridge ) ## å«å > Handle/Body ## ç¨é > å°æ½è±¡é¨åä¸å®çå®ç°é¨ååç¦»ï¼ ä½¿å®ä»¬é½å¯ä»¥ç¬ç«å°ååã > > å½ä¸ä¸ªæ½è±¡å¯è½æå¤ä¸ªå®ç°æ¶ï¼ é常ç¨ç»§æ¿æ¥åè°å®ä»¬ã æ½è±¡ç±»å®ä¹å¯¹è¯±æ½è±¡çæ¥å£ï¼èå ·ä½çåç±»åç¨ä¸åæ¹å¼å 以å®ç°ã 使¯æ¤æ¹æ³ææ¶ä¸å¤çµæ´»ã ç»§æ¿æºå¶å°æ½è±¡é¨åä¸å®çå®ç°é¨ååºå®å¨ä¸èµ·ï¼ 使å¾é¾ä»¥å¯¹æ½è±¡é¨ååå®ç°é¨åç¬ç«å°è¿è¡ä¿®æ¹ã æ©å åéç¨ã ## å®ä¾ > åå®ä¸¤ç§æäºââç°ä»£æäºåå¤ä»£æäºï¼æäºä¸çæäººå为å®åéååä¸å ªä¸å»ä¸¤ç§ï¼ä¸¤ç§æäºä½¿ç¨ä¸åçæ¦å¨è£ å¤ï¼åæ ·ï¼ä¸¤ç§æäººå¨æäºä¸åå°çæå»ä¹ä¸åï¼è£ å¤ä¼è¯ãåäºä½æçåææ¹ææäºå¹³æï¼èå¦ä¸ä¸æäººè£ å¤è½åï¼ç®¡çæ··ä¹±ï¼å£«æ°ä½è¿·ï¼æç»è¢«ææ¹æè´¥ã ## 模å¼åæ > å®ä¹æäºæ¥å£ ``` public interface War { Enemy getEnemy(); void startWar(); void combatting(); void stopWar(); } ``` > å®ä¹æäººæ¥å£ ``` public interface Enemy { void onStartWar(); void onCombatting(); void onStopWar(); } ``` > å®ä¹ä¸¤ç§ä¸åæäºçå®ç°ç±» ``` /** * ç°ä»£æäº */ public class MordernWar implements War { private static final Logger LOGGER = LoggerFactory.getLogger(MordernWar.class); private final Enemy enemy; public MordernWar(Enemy enemy) { this.enemy = enemy; } @Override public Enemy getEnemy() { return this.enemy; } @Override public void startWar() { LOGGER.info("ä¸åºç°ä»£æäºå¼å§äº"); enemy.onStartWar(); } @Override public void combatting() { LOGGER.info("ç°ä»£æäºæ£å¨æ¿çè¿è¡ä¸"); enemy.onCombatting(); } @Override public void stopWar() { LOGGER.info("è¿åºç°ä»£æäºç»æäº"); enemy.onStopWar(); } } /** * å¤ä»£æäº */ public class AncientWar implements War { private static final Logger LOGGER = LoggerFactory.getLogger(AncientWar.class); private final Enemy enemy; public AncientWar(Enemy enemy) { this.enemy = enemy; } @Override public Enemy getEnemy() { return this.enemy; } @Override public void startWar() { LOGGER.info("ä¸åºå¤ä»£æäºå¼å§äº"); enemy.onStartWar(); } @Override public void combatting() { LOGGER.info("å¤ä»£æäºæ£å¨æ¿çè¿è¡ä¸"); enemy.onCombatting(); } @Override public void stopWar() { LOGGER.info("è¿åºå¤ä»£æäºç»æäº"); enemy.onStopWar(); } } ``` > ä¸¤ç§æäººæ ¹æ®æäºçä¸åè¿å±ä½åºè¡¨ç°åºä¸åçç¶æ ``` /** * 强大çæäºº */ public class IntrepidEnemy implements Enemy { private static final Logger LOGGER = LoggerFactory.getLogger(IntrepidEnemy.class); @Override public void onStartWar() { LOGGER.info("æäººä¿¡å¿æ»¡æ»¡ï¼åå¤è¿æ"); } @Override public void onCombatting() { LOGGER.info("æäººæ£å¨ç§¯æåæ"); } @Override public void onStopWar() { LOGGER.info("åæ¹è¾¾æäºå¹³æ"); } } /** * ä¸å ªä¸å»çæäºº */ public class TenderEnemy implements Enemy { private static final Logger LOGGER = LoggerFactory.getLogger(TenderEnemy.class); @Override public void onStartWar() { LOGGER.info("æäººå£«æ°ä¸è¶³ï¼æ å¥è¿æ"); } @Override public void onCombatting() { LOGGER.info("æäººçº·çº·æºè´¥"); } @Override public void onStopWar() { LOGGER.info("æäººä¸å ªä¸å»ï¼åªå¾æé"); } } ``` ``` // å¤ä»£æäºå强大çæäºº War war1 = new AncientWar(new IntrepidEnemy()); // æäºå¼å§ war1.startWar(); // æäºè¿è¡ä¸ war1.combatting(); war1.stopWar(); // æäºç»æ LOGGER.info("\n"); // ç°ä»£æäºåä¸å ªä¸å»çæäºº War war2 = new MordernWar(new TenderEnemy()); // æäºå¼å§ war2.startWar(); // æäºè¿è¡ä¸ war2.combatting(); // æäºç»æ war2.stopWar(); LOGGER.info("\n"); ``` ## éç¨åºæ¯ >* ä½ ä¸å¸æå¨æ½è±¡åå®çå®ç°é¨åä¹é´æä¸ä¸ªåºå®çç»å®å ³ç³»ãä¾å¦è¿ç§æ åµå¯è½æ¯å 为,å¨ç¨åºè¿è¡æ¶å»å®ç°é¨ååºå¯ä»¥è¢«éæ©æè 忢 > >* ç±»çæ½è±¡ä»¥åå®çå®ç°é½åºè¯¥å¯ä»¥éè¿çæåç±»çæ¹æ³å 以æ©å ã è¿æ¶ Bridge 模å¼ä½¿ä½ å¯ä»¥å¯¹ä¸åçæ½è±¡æ¥å£åå®ç°é¨åè¿è¡ç»åï¼ å¹¶åå«å¯¹å®ä»¬è¿è¡æ©å > >* 对ä¸ä¸ªæ½è±¡çå®ç°é¨åçä¿®æ¹åºå¯¹å®¢æ·ä¸äº§çå½±åï¼ å³å®¢æ·ç«¯ç代ç ä¸å¿ éæ°ç¼è¯ > >* ä½ æ³å¨å¤ä¸ªå¯¹è±¡é´å ±äº«å®ç°ï¼å¯è½ä½¿ç¨å¼ç¨è®¡æ°ï¼ï¼ ä½åæ¶è¦æ±å®¢æ·ç«¯å¹¶ä¸ç¥éè¿ä¸ç¹