桥接模式,初学的时候事实上非常不理解为什么要把这个模式命名为桥接模式,脑海里突然联想到。事实上我学习是一件比較痛苦的事情,由于我必需要知道来龙去脉才干学的进去,所以,非常快我就对这个命名产生了兴趣,桥接?
嗯,桥接!先把桥字换成连字,连接?桥接?桥接和连接最大的不同是桥接是降具有同样模式的两种事物连接起来,这是我依据词典的解释得出的。
好吧,具有同样模式,瞬间便想到了接口,是不是有职业病?
将抽象部分与实现部分分离,使它们都能够独立的变化。
——《设计模式》GOF
再结合GOF的设计模式说明,非常easy就理解为什么是命名为桥接。
抽象的是接口,实现的是类。
在我们的代码中,当传入对象參数而不是基本数据类型參数的时候,我们有时候会传入2种类型的參数。比方
public void menthd(List list)
public void method1(ArrayList arrayList)
这两种有一个最大的差别,ArrayList 是 List 的实现类,当我们调用method方法的时候,你能够传入的參数是ArrayList 和 LinkedList,可是调用另外一种方法你仅仅能传入ArrayList,这样非常明显就有缺陷了,当ArrayList不满足我们需求的时候,我们必需要重写一个method1方法,这样对我们的代码结构是非常不利,也违法了JAVA设计的开闭原则。
拿出这个我们写出实际的代码,当然我们这里不再用ArrayList做演示。。
先定义出接口
public interface TestInterface { public void method(); }
再来一个实现类
public class TestInterfaceImpl1 implements TestInterface{ @Override public void method() { System.out.println("需求1"); } }
调用类:
public class Bridge { public void test(TestInterfaceImpl1 impl1){ impl1.method(); } }
測试代码:
public class Test { public static void main(String[] args) { Bridge bridge = new Bridge(); TestInterfaceImpl1 impl1 = new TestInterfaceImpl1(); bridge.test(impl1); } }
输出:需求1
然后,我们的需求改变,我们要将TestInterface 中method方法实现改为还有一种需求2的实现方式,那么你这里须要改动的地方就比較多了。。。
必需要做的事情,新增实现类。
public class TestInterfaceImpl2 implements TestInterface{ @Override public void method() { System.out.println("需求2"); } }
然后我们还须要修改Bridge,要新增一个方法去传入TestInterfaceImpl2 的对象,修改原来的代码是我们最不愿意看到的,当然你也能够新增一个适配器类去实现,可是,假设当时我们的Bridge设计之初就不是这样设计,而是传入接口的引用对象呢?
将Bridge改动成
public class Bridge { public void test(TestInterface impl){ impl1.method(); } }
这样,你出现新需求的时候就无需修改原先的代码。。
測试类:
public class Test { public static void main(String[] args) { Bridge bridge = new Bridge(); TestInterface impl1 = new TestInterfaceImpl1(); bridge.test(impl1); TestInterface impl2 = new TestInterfaceImpl2(); bridge.test(impl2); } }
输出:
需求1
需求2
这就是GOF所说的将抽象部分与实现部分分离,使它们都能够独立的变化。
在这套代码中,抽象的是接口,将抽象的接口与实现部分分离,传入的是向上引用的类对象,这样你的实现类再怎么改变对于整套代码都不会有不论什么影响。。。。。
这就是桥接模式!
面向对象,真不简单!