23种设计模式(9) java桥接模式

介绍

桥接模式 (Bridge)将抽象部分与实现部分分离,使它们都可以独立的变化。
桥接模式是一种结构式模式。

结构

代码实现

Implementor : 定义实现接口。

interface Implementor {
  // 实现抽象部分需要的某些具体功能
  public void operationImpl();
}

Abstraction : 定义抽象接口。

abstract class Abstraction {
  // 持有一个 Implementor 对象,形成聚合关系
  protected Implementor implementor;

  public Abstraction(Implementor implementor) {
    this.implementor = implementor;
  }

  // 可能需要转调实现部分的具体实现
  public void operation() {
    implementor.operationImpl();
  }
}

ConcreteImplementor :  实现 Implementor 中定义的接口。

class ConcreteImplementorA implements Implementor {
  @Override
  public void operationImpl() {
    // 真正的实现
    System.out.println("具体实现A");
  }
}

class ConcreteImplementorB implements Implementor {
  @Override
  public void operationImpl() {
    // 真正的实现
    System.out.println("具体实现B");
  }
}

RefinedAbstraction : 扩展 Abstraction 类。

class RefinedAbstraction extends Abstraction {

  public RefinedAbstraction(Implementor implementor) {
    super(implementor);
  }

  public void otherOperation() {
    // 实现一定的功能,可能会使用具体实现部分的实现方法,
    // 但是本方法更大的可能是使用 Abstraction 中定义的方法,
    // 通过组合使用 Abstraction 中定义的方法来完成更多的功能。
  }
}

测试代码

public class BridgePattern {
  public static void main(String[] args) {
    Implementor implementor = new ConcreteImplementorA();
    RefinedAbstraction abstraction = new RefinedAbstraction(implementor);
    abstraction.operation();
    abstraction.otherOperation();
  }
}

运行结果

具体实现A
其他操作

应用场景

1、如果你不希望在抽象和实现部分采用固定的绑定关系,可以采用桥接模式,来把抽象和实现部分分开,
然后在程序运行期间来动态的设置抽象部分需要用到的具体的实现,还可以动态切换具体的实现。

2、如果出现抽象部分和实现部分都应该可以扩展的情况,可以采用桥接模式,让抽象部分和实现部分可以
独立的变化,从而可以灵活的进行单独扩展,而不是搅在一起,扩展一边会影响到另一边。

3、如果希望实现部分的修改,不会对客户产生影响,可以采用桥接模式,客户是面向抽象的接口在运行,
实现部分的修改,可以独立于抽象部分,也就不会对客户产生影响了,也可以说对客户是透明的。

4、如果采用继承的实现方案,会导致产生很多子类,对于这种情况,可以考虑采用桥接模式,分析功能变化的原因,看看是否能分离成不同的纬度,然后通过桥接模式来分离它们,从而减少子类的数目。

要点

如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
抽象化角色和具体化角色都应该可以被子类扩展。在这种情况下,桥接模式可以灵活地组合不同的抽象化角色和具体化角色,并独立化地扩展。
设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 23种设计模式(6) java装饰者模式

    23种设计模式第六篇:java装饰者模式 定义: 在不必改变原类文件和原类使用的继承的情况下,动态地扩展一个对象的功能.     它是通过创建一个包装对象,也就是用装饰来包裹真实的对象来实现. 角色: 抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象.     具体构件角色(Employe):定义一个将要接收附加责任的类.     装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口.     具体装饰角色(ManagerA.Manag

  • 23种设计模式(8) java外观模式

    23种设计模式第八篇:java外观模式 定义: 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 角色: 1.外观(Facade)角色 :客户端可以调用这个角色的方法.此角色知晓相关子系统的功能和责任.在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去. 2.子系统(SubSystem)角色 :可以同时有一个或者多个子系统.每个子系统都不是一个单独的类,而是一个类的集合.每个子系统都可以被客户端直接调用,或者被外观角

  • 23种设计模式(4) java生成器模式

    23种设计模式第四篇:java生成器模式 定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.生成器模式利用一个导演者对象和具体建造者对象一个一个地建造出所有的零件,从而建造出完整的对象. 四个要素: Builder:生成器接口,定义创建一个Product对象所需要的各个部件的操作.         ConcreteBuilder:具体的生成器实现,实现各个部件的创建,并负责组装Product对象的各个部件,同时还提供一个让用户获取组装完成后的产品对象的方法.   

  • 23种设计模式(5) java适配器模式

    23种设计模式第五篇:java适配器模式 定义: 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 角色: 目标(Target)角色:这就是所期待得到的接口,也就是这类的接口是符合我们要求的. 源(Adapee)角色:我们要使用的接口,但是这个接口不符合我们的要求,也就是现在需要适配的接口. 适配器(Adaper)角色:适配器类是适配器模式的核心.适配器把源接口转换成目标接口.显然,这一角色不可以是接口,而必须是具体类. 分类: 1

  • 23种设计模式(2) java工厂模式

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式根据抽象程度的不同分为三种: 简单工厂模式(也叫静态工厂模式) 工厂方法模式(也叫多形性工厂) 抽象工厂模式(也叫工具箱) 简单工厂模式 实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接

  • 23种设计模式(1) java单例模式

    23种设计模式第四篇:java单例模式 定义: 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例. 特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例 单例模式的要点: 1.私有的构造方法     2.指向自己实例的私有静态引用     3.以自己实例为返回值的静态的公有的方法 单例模式根据实例化对象时机的不同分为两种: 一

  • 23种设计模式(10)java组合模式

    23种设计模式第四篇:java组合模式 介绍 组合模式又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解藕. 组合模式可以优化处理递归或分级数据结构.有许多关于分级数据结构的例子,使得组合模式非常有用武之地. 类图 组成部分: Component: 为参加组合的对象声明一个公共接口, 不管是组合还是叶结点. Leaf: 在组合中表示叶子结点对象,叶子结点没有子结点. Composit

  • 23种设计模式(7) java代理模式

    23种设计模式第七篇:java代理模式 定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 角色: 1.抽象角色:声明真实对象和代理对象的共同接口. 2.代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装. 3.真实角色:

  • 23种设计模式(3) java原型模式

    23种设计模式第三篇:java原型模式 定义: 通过复制现有的对象实例来创建新的对象实例. 实现: 实现Cloneable接口: Cloneable接口的作用是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法.在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常. 重写Object类中的clone方法: Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的

  • Java设计模式之java桥接模式详解

    目录 一.什么是桥接模式: 二.UML结构图: 三.代码实现: 四.JDBC源码解析-桥接模式: 1.源码分析: 2.源码类图: 3.对 JDBC 的观点: 参考博客: 总结 一.什么是桥接模式: 桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯,桥接模式的作用就是为被分离的抽象部分和实现部分搭桥.在现实生活中一个物品在搭配不同的配件时会产生不同的动作和结果,例如一辆赛车搭配的是硬胎或者是软胎就能够在干燥的马路上行驶,而如果要在下雨的路面行驶,就需要搭配雨胎了,这种根据行驶的路面不

  • 23种设计模式(12)java模版方法模式

    23种设计模式第四篇:java模版方法模式 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了.但是A有办法,先把打印功能完成,排序功能另找人做. abs

  • 23种设计模式(14)java迭代器模式

    23种设计模式第十四篇:java迭代器模式 定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节. 类型:行为类模式 类图: 如果要问java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式,先来看一段代码吧: public static void print(Collection coll){ Iterator it = coll.iterator(); while(it.hasNext()){ String str = (String

随机推荐