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

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

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

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

                                                                    ——《设计模式》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. C#开源汇总

    原文:C#开源汇总 商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Pho ...

  2. 跨平台网络通信与server编程框架库(acl库)介绍

    一.描写叙述 acl project是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及server编程框架,同一时候提供很多其它的有用功能库.通过该库 ...

  3. ssh, maven and eclipse 那些破事

    Unix根据该理念keep it simple, keep it stupid.可在j2ee有keep it complex, keep it smart. 所以,我彻底晕菜. 最后能活着把sprin ...

  4. const void *a 与 void *const a 的差别

    const void *a 这是定义了一个指针a,a能够指向随意类型的值,但它指向的值必须是常量. 在这样的情况下,我们不能改动被指向的对象,但能够使指针指向其它对象. 比如: const void ...

  5. 基于FFMPEG和SDL实现视频播放器

    这个是雷大牛实现的project. http://download.csdn.net/detail/leixiaohua1020/5122959 有兴趣的能够好好研究研究.

  6. Knockout应用开发指南 第三章:绑定语法(1)

    原文:Knockout应用开发指南 第三章:绑定语法(1) 第三章所有代码都需要启用KO的ko.applyBindings(viewModel);功能,才能使代码生效,为了节约篇幅,所有例子均省略了此 ...

  7. Navicat工具破解

        Navicat提供多达 7 种语言供客户选择,被公认为全球最受欢迎的数据库前端用户介面工具.它可以用来对本机或远程的 MySQL.SQL Server.SQLite.Oracle 及 Post ...

  8. Windows phone 8 学习笔记(6) 多任务

    原文:Windows phone 8 学习笔记(6) 多任务 Windows phone 8 是一个单任务操作系统,任何时候都只有一个应用处于活跃状态,这里的多任务是指对后台任务的支持.本节我们先讲讲 ...

  9. vim ctl+v批量添加/删除

    vim编辑器---批量注释与反注释 在使用vim编写代码的时候,经常需要用到批量注释与反注释一段代码.下面简要介绍其操作. 方法一 块选择模式 插入注释: 用v进入virtual模式 用上下键选中需要 ...

  10. CC2530 外部中断 提醒

    #include "ioCC2530.h" #define uchar unsigned char #define led1    P1_0 #define led2    P1_ ...