桥接模式
2012 年 2 月 13 日
桥接模式
先不说定义直接来看一个问题,有一个手机抽象类
public abstract class Phone{ public abstract void getName(); public abstract void getRam(); }
里面有两个抽象方法,获得手机型号和内存大小。现在我们想实例化小米10这个型号的手机
public class Mi106g extends Phone { @Override public void getName() { System.out.println("小米10"); } @Override public void getRam() { System.out.println("6"); } } public class Mi1068g extends Phone { @Override public void getName() { System.out.println("小米10"); } @Override public void getRam() { System.out.println("8"); } }
两个方法可能看起来不明显,是1×2,如果现在多出一个方法是getRom,Rom的种类有3种,128,256,512。那么需要的类就变成了1x2x3,属性越多需要的类就越多,这样维护起来就很麻烦。这时候我们就需要用组合解决这个子类爆炸的问题
public abstract class Phone { Ram ram; public void setRam(Ram ram){ this.ram = ram; } public abstract void model(); } public abstract class Ram { public abstract void getRam(); }
现在Ram作为一个单独的类,和Phone组合
public class Mi10 extends Phone { @Override public void model() { System.out.println("Mi10"); } } public class Ram6 extends Ram { @Override public void getRam() { System.out.println("6g"); } } public class Ram8 extends Ram { @Override public void getRam() { System.out.println("8g"); } }
那我们要获得一个6g的Mi10怎么来弄呢
Phone Mi106g = new Mi10(); Mi106g.setRam(new Ram6());
或者是设置在构造函数里,重点在于组合。
现在来看一下桥接模式的定义
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
我感觉这个确实有点抽象不太好理解,这里不是说编程语言里的抽象和实现,结合上面的例子,手机的型号可以理解为抽象,Ram理解为实现,因为手机型号是一个笼统的概念,而Ram就是内存本身,通过把他俩分离开来,型号可以单独的变化,内存大小也可以单独的变化,然后再组合到一起。
总结
个人觉的桥接模式就是用组合避免继承子类爆炸问题