首页 > 代码库 > 菜鸟版JAVA设计模式-从抽象与实现说桥接模式

菜鸟版JAVA设计模式-从抽象与实现说桥接模式

桥接模式,初学的时候其实很不理解为什么要把这个模式命名为桥接模式,脑海里突然联想到。其实我学习是一件比较痛苦的事情,因为我必须要知道来龙去脉才能学的进去,所以,很快我就对这个命名产生了兴趣,桥接?

嗯,桥接!先把桥字换成连字,连接?桥接?桥接和连接最大的不同是桥接是降具有相同模式的两种事物连接起来,这是我根据词典的解释得出的。

好吧,具有相同模式,瞬间便想到了接口,是不是有职业病?

将抽象部分与实现部分分离,使它们都可以独立的变化。
                                                                    ——《设计模式》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,要新增一个方法去传入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所说的将抽象部分与实现部分分离,使它们都可以独立的变化。

在这套代码中,抽象的是接口,将抽象的接口与实现部分分离,传入的是向上引用的类对象,这样你的实现类再怎么改变对于整套代码都不会有任何影响。。。。。

这就是桥接模式!


面向对象,真不简单!

菜鸟版JAVA设计模式-从抽象与实现说桥接模式