桥接模式
- 概述
- UML类图
- 代码栗子
- 总结
-
概述
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- 来个栗子
小明买了一辆法拉利,但是发现法拉利村里的人不认识,没法儿***,因此小明特地又去买了一辆宝马,这下就可以开出去不用解释这是啥车了,买回来后就开始要为爱车安装各种装饰品,它的两辆车可以任意搭配饰品,结论来了<抽象与实现分离、实现部分独立地变化>
-
UML
- 优点:实现系统可能有多角度分类,每一种分类都有可能变化,分离并独立变化,减少它们之间的耦合
- 来个栗子
-
栗子
/*汽车基类*/ public abstract class Car { /** * 安装导航仪 * @param navigator */ public abstract void installNavigator(INavigator navigator); /** * 开启导航 * 开启导航是调用导航接口实现类的方法 */ public abstract void open(); }
/*宝马牌汽车*/ public class BMWCar extends Car { /**导航仪*/ INavigator navigator = null; @Override public void installNavigator(INavigator n) { System.out.println("宝马成功安装了:"+n.toString()); navigator = n; } @Override public void open() { navigator.work(); } } /*法拉利牌汽车*/ public class FerrariCar extends Car { /**导航仪*/ INavigator navigator = null; @Override public void installNavigator(INavigator n) { System.out.println("法拉利成功安装了:"+n.toString()); navigator = n; } @Override public void open() { navigator.work(); } }
/*导航仪接口*/ public interface INavigator { /** * 导航实现 */ void work(); }
/*高德导航仪*/ public class AmapNavigator implements INavigator { @Override public void work() { System.out.println("我是高德导航仪!"); } @Override public String toString() { return "【高德导航仪】"; } } /*北斗导航仪*/ public class BdNavigator implements INavigator { @Override public String toString() { return "【北斗牌导航仪】"; } @Override public void work() { System.out.println("我是北斗导航仪!"); } }
-
测试
public class Main { public static void main(String[] args) { test1() ; test1_1() ; } public static void test1(){ INavigator bdNavigator = new BdNavigator(); //法拉利安装北斗导航 Car ferrariCar = new FerrariCar() ; ferrariCar.installNavigator(bdNavigator); ferrariCar.open(); } public static void test1_1(){ INavigator amapNavigator = new AmapNavigator(); //宝马安装了高德导航仪 Car ghostCar = new BMWCar(); ghostCar.installNavigator(amapNavigator); ghostCar.open(); } }
-
-
总结
- 桥接方式比继承的方式要更灵活,它是汽车与配件可以独立各自的发展
- 当继承造成大量类增加且不能满足开闭原则时,可以考虑使用桥接模式