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、如果采用继承的实现方案,会导致产生很多子类,对于这种情况,可以考虑采用桥接模式,分析功能变

化的原因,看看是否能分离成不同的纬度,然后通过桥接模式来分离它们,从而减少子类的数目。

要点

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

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

6 道 BATJ 必考的 Java 面试题

请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别?

751
来自专栏精讲JAVA

Gof设计模式之单例模式(一)

今天开始更新设计模式系列,题目中Gof指的是《Design Patterns: Elements of Reusable Object-Orie...

1965
来自专栏LanceToBigData

OOAD-设计模式(二)之GRASP模式与GOF设计模式概述

一、GRASP模式(通用责任分配软件模式)概述 1.1、理解责任   1)什么是责任     责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为...

16610
来自专栏熊二哥

UML快速入门

UML(Unified Modeling Language)统一建模语言的概念已经出现了近20年,虽然并不是所有的概念都非常有实践意义,但常见的用例图、类图、序...

1829
来自专栏java一日一条

书写高质量代码之状态维护

我们第一眼接触新事物所触发的思考方式,决定了以后我们看待这样事物的角度,进而影响更深层次的理解和行为。

381
来自专栏社区的朋友们

在共享内存实现 Redis(下)

从实现方式入手,设计了一种综合二者优点的方案:将 Redis 做成数据逻辑分离,数据存放共享内存,进程只负责存储逻辑,同时解决 Redis 长命令卡顿和 for...

2540
来自专栏积累沉淀

Java设计模式(三—四)----工厂模式

Java设计模式 工厂模式 一、引言 二、分类 三、简单工厂模式 四、工厂方法模式 五、抽象工厂模式 六、和工厂方法模式区别 七、总...

1765
来自专栏linux驱动个人学习

设计模式

一、设计模式简介 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面...

2725
来自专栏高性能分布式系统设计

基于 CSP 的设计思想和 OOP 设计思想的异同

Go语言推崇的CSP编程模型和设计思想,并没有引起很多Go开发者包括Go标准库作者的重视。标准库的很多设计保留了很浓的OOP的味道。本篇Blog想比较下从设计的...

3514
来自专栏Ryan Miao

java设计模式(五)--建造者模式(Builder)

转载:http://zz563143188.iteye.com/blog/1847029 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来...

3036

扫码关注云+社区