将抽象部分与实现部分分离,使它们都可以独立的变化。
——《设计模式》GOF
再结合GOF的设计模式说明,很容易就理解为什么是命名为桥接。
抽象的是接口,实现的是类。
在我们的代码中,当传入对象参数而不是基本数据类型参数的时候,我们有时候会传入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修改成
- 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所说的将抽象部分与实现部分分离,使它们都可以独立的变化。
在这套代码中,抽象的是接口,将抽象的接口与实现部分分离,传入的是向上引用的类对象,这样你的实现类再怎么改变对于整套代码都不会有任何影响。。。。。
这就是桥接模式!