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

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

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

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

                                                                    ——《设计模式》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. cocos2d-x 类大全及其概要

    CCNode 节点类是Cocos2D-x中的主要类,继承自CCObject. 任何需要画在屏幕上的对象都是节点类.最常用的节点类包括场景类(CCScene).布景层类(CCLayer).人物精灵类(C ...

  2. (ZT)LoadRunner9.0成功破解方法

    LoadRunner9.0软件下载地址: http://www.3atesting.com/filedown/LR9Download.exe 破解所需文件 http://download.csdn.n ...

  3. c#抓取动态页面WebBrowser

    在ajax横行的年代,很多网页的内容都是动态加载的,而我们的小爬虫抓取的仅仅是web服务器返回给我们的html,这其中就 跳过了js加载的部分,也就是说爬虫抓取的网页是残缺的,不完整的,下面可以看下博 ...

  4. tudou link

    http://www.tudou.com/programs/view/QdOktCIUfQ0/?tid=-1&aid=-120137222&pid=41050010&oid=2 ...

  5. HTC one/M7电信802d 毒蛇ViperOne2.1.0/高级毒蛇工具/完美root,精简/更多自定义,稳定,流畅ROM

    ROM版本 HTC One/M7 802d ROM作者 雪狼团队·大盛 http://weibo.com/DaShengdd Android版本 Android 4.2.2 创建日期 2013.09. ...

  6. C++ 中获取 可变形參函数中的參数

    #include <iostream> #include <stdarg.h> using namespace std; int ArgFunc(const char * st ...

  7. Jersey框架二:Jersey对JSON的支持

    Jersey系列文章: Jersey框架一:Jersey RESTful WebService框架简介 Jersey框架二:Jersey对JSON的支持 Jersey框架三:Jersey对HTTPS的 ...

  8. tomcat压缩优化和缓存策略

    tomcat压缩内容 tomcat的压缩优化就是将返回的html页面等内容经过压缩,压缩成gzip格式之后.发送给浏览器,浏览器在本地解压缩的过程. 对于页面量信息大或者带宽小的情况下用压缩方式还是蛮 ...

  9. Win7+ubuntu kylin+CentOS 6.5三系统安装图文教程

    Win7+ubuntu kylin+CentOS 6.5三系统安装图文教程 引言:原本机子上已经装好了win7+Ubuntu Kylin 由win7引导,而不是Ubuntu的grub引导的双系统(安装 ...

  10. 关于identifier was truncated to '255' characters

    学习c++过程中,遇到在VC中使用set时DEBUG模式出现的警告 identifier was truncated to '255' characters in the debug informat ...