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

来源:互联网 发布:嘉兴学院网络管理中心 编辑:程序博客网 时间:2024/05/22 04:57

将抽象部分与实现部分分离,使它们都可以独立的变化。
                                                                    ——《设计模式》GOF 

再结合GOF的设计模式说明,很容易就理解为什么是命名为桥接。

抽象的是接口,实现的是类。

在我们的代码中,当传入对象参数而不是基本数据类型参数的时候,我们有时候会传入2种类型的参数。比如

public void menthd(List list)


public void method1(ArrayList arrayList)


这两种有一个最大的区别,ArrayList  是 List 的实现类,当我们调用method方法的时候,你可以传入的参数是ArrayList  和  LinkedList,但是调用第二种方法你只能传入ArrayList,这样很明显就有缺陷了,当ArrayList不满足我们需求的时候,我们必须要重写一个method1方法,这样对我们的代码结构是很不利,也违法了JAVA设计的开闭原则。

拿出这个我们写出实际的代码,当然我们这里不再用ArrayList做演示。。

先定义出接口

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public interface TestInterface {  
  2.     public void method();  
  3. }  

再来一个实现类

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class TestInterfaceImpl1 implements TestInterface{  
  2.   
  3.     @Override  
  4.     public void method() {  
  5.         System.out.println("需求1");  
  6.     }  
  7.   
  8. }  


调用类:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class Bridge {  
  2.     public void test(TestInterfaceImpl1 impl1){  
  3.         impl1.method();  
  4.     }  
  5. }  


测试代码:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Bridge bridge = new Bridge();  
  4.         TestInterfaceImpl1 impl1 = new TestInterfaceImpl1();  
  5.         bridge.test(impl1);  
  6.   
  7.     }  
  8. }  

输出:需求1


然后,我们的需求改变,我们要将TestInterface 中method方法实现改为另一种需求2的实现方式,那么你这里需要修改的地方就比较多了。。。

必须要做的事情,新增实现类。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class TestInterfaceImpl2 implements TestInterface{  
  2.     @Override  
  3.     public void method() {  
  4.         System.out.println("需求2");  
  5.     }  
  6. }  


然后我们还需要修改Bridge,要新增一个方法去传入TestInterfaceImpl2 的对象,改动原来的代码是我们最不愿意看到的,当然你也可以新增一个适配器类去实现,但是,如果当时我们的Bridge设计之初就不是这样设计,而是传入接口的引用对象呢?

将Bridge修改成

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class Bridge {  
  2.     public void test(TestInterface impl){  
  3.         impl1.method();  
  4.     }  
  5. }  


这样,你出现新需求的时候就无需改动原先的代码。。

测试类:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Bridge bridge = new Bridge();  
  4.         TestInterface impl1 = new TestInterfaceImpl1();  
  5.         bridge.test(impl1);  
  6.           
  7.         TestInterface impl2 = new TestInterfaceImpl2();  
  8.         bridge.test(impl2);  
  9.   
  10.     }  
  11. }  

输出:

需求1
需求2


这就是GOF所说的将抽象部分与实现部分分离,使它们都可以独立的变化。

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

这就是桥接模式!

0 0
原创粉丝点击