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

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

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

将抽象部分与实现部分分离,使它们都能够独立的变化。

                                                                    ——《设计模式》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所说的将抽象部分与实现部分分离,使它们都能够独立的变化。

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

这就是桥接模式!

面向对象,真不简单!

菜鸟版JAVA设计模式-从抽象与实现说桥接模式的更多相关文章

  1. 菜鸟版JAVA设计模式—从买房子看代理模式

    今天学习了代理模式. 相对于适配器模式,或者说装饰器模式,代理模式理解起来更加简单. 代理这个词应该比較好理解,取代去做就是代理. 比方,我们买卖房子,那么我们会找中介,我要卖房子,可是我们没有时间去 ...

  2. 菜鸟版JAVA设计模式—外观模式

    外观模式是一种比較easy理解的模式,作用非常easy.就是解耦合. 结构也是非常easy,一个外观类.这个外观类持有非常多的业务类. 再由客户类去调用这个外观类去实现一些列的业务操作... 这个模式 ...

  3. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  4. Java 设计模式系列(二十)状态模式

    Java 设计模式系列(二十)状态模式 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改 ...

  5. Java 设计模式系列(十二)策略模式(Strategy)

    Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...

  6. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

  7. Java 设计模式系列(十七)中介者模式

    Java 设计模式系列(十七)中介者模式 用一个中介对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互 一.中介者模式结构 Media ...

  8. Java 设计模式系列(八)装饰者模式

    Java 设计模式系列(八)装饰者模式 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.Decorator 或 Wrapper 一.装饰模 ...

  9. 深入探索Java设计模式(三)之装饰器模式

    装饰器模式使你可以在运行时使用类似于对象组成的技术来装饰类.这在我们希望实例化具有新职责的对象而无需对基础类进行任何代码更改的情况下尤其有用.本文是在学习完优锐课JAVA架构VIP课程—[框架源码专题 ...

随机推荐

  1. Android NDK入门实例 计算斐波那契数列二生成.so库文件

    上一篇文章输生成了jni头文件,里面包含了本地C代码的信息,提供我们引用的C头文件.下面实现本地代码,再用ndk-build编译生成.so库文件.由于编译时要用到make和gcc,这里很多人是通过安装 ...

  2. asp.net mvc4中自定义404页面

    原文地址:http://www.chuchur.com/asp-net-mvc4-404/ 定义404 方法当然有很多种.不同的方法所展现的形式也不一样,用户所体验也不一样.以下提供2两种 方法一: ...

  3. Kafka 高性能吞吐揭秘

    Kafka 高性能吞吐揭秘   Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分 ...

  4. jdk1.6与1.7垃圾回收

    最近项目中遇到了个关于JVM中GC线程数的问题,做一下简单的总结 问题场景: server:均为 sun公司的solaris 系统 CPU 128个 项目8.1时使用的 java版本:   jdk1. ...

  5. Working with forms

    翻译 Django文档 Version 1.5 https://docs.djangoproject.com/en/1.5/topics/forms Working with forms 关于此文章: ...

  6. Python使用MySQLdb操作MySQL

    import MySQLdb,sys try: conn=MySQLdb.connect(host=,user=',db='db1') except Exception,e: print e sys. ...

  7. shell 脚本之if、for、while语句

    (1)if语句 root@ubuntu:/mnt/shared/shellbox/shellif# cat shellif.sh #!/bin/bash #推断字符串 if [ "$1&qu ...

  8. ios7开发者必知

    如果你想为iOS 设备开发app,你需要知道如何与软件交互,如何设计,你还要知道苹果独特的开发理念和开发工具.真正的能力还需要成功地从其他行业领域借鉴核心概念.最后把所有这些东西糅合进你的信息库中, ...

  9. 6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

     1组函数 avg(),sum(),max(),min(),count()案例: selectavg(sal),sum(sal),max(sal),min(sal),count(sal) from ...

  10. Java的内存泄漏和垃圾回收机制

    JAVA会产生内存泄露吗?首先,答案是肯定的. Java尽管有垃圾回收器,但依旧存在泄漏. Java内存泄漏跟C/C++内存泄漏的概念不一样:C/C++的内存泄漏是指Malloc了一些资源.最后没有f ...