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 条评论
登录 后参与评论

相关文章

来自专栏鹅厂优文

深入浅出Lua虚拟机

本文标题是”深入浅出 Lua 虚拟机”,其实重点在浅出这两字上。毕竟作者的技术水平有限。但是听说名字要起的屌一点文章才有人看,故而得名。

1.1K14
来自专栏王硕

原 PostgreSQL的FSM分析记录

711
来自专栏Create Sun

基础拾遗-----mongoDB操作

前言   nosq互联网中运用极广的技术,mongo应该算是必不可少的技术之一,虽说我在项目中redis用的较多,mongo在项目中算是用的比较少的技术,但是也...

34111
来自专栏机器学习实践二三事

Theano的一个关于signal,signal/conv,signal/downsample的错误

安装了Theano和keras之后,准备走段代码出错了,大概意思是: “Theano is missing signal”,就是说signal模块找不到,我跑...

2138
来自专栏Python小屋

Python批量检查网页是否被注入其他页面

代码思路:对于给定的文件夹中所有网页文件,读取其内容,然后使用正则表达式检查该文件中是否包含iframe框架,如果有的话就返回文件名和iframe代码,表示是一...

34511
来自专栏老九学堂

【新手必读】Java初学者,你遇到的问题都在这了

很多小伙伴初次接触Java时往往会感觉十分迷茫,在这里老九君收集并解答了同学们遇到的一些基础问题,希望能对大家的Java学习之路有所帮助。 初识篇 1、什么是J...

3216
来自专栏向治洪

Android热修复技术总结

插件化和热修复技术是Android开发中比较高级的知识点,是中级开发人员通向高级开发中必须掌握的技能,插件化的知识可以查我我之前的介绍:Android插件化。本...

2726
来自专栏积累沉淀

strom架构和构建Topology

1.Hadoop的MapReduce与Storm的topology有什么不一样的地方? 2.Nimbus与hadoop的jobtracer作用是否类似? ...

2107
来自专栏Crossin的编程教室

一些常见的新手问题

本账号开设至今,回答的各种问题,没有一万也有八千了。今天挑了其中曝光率较高的一些问题,跟各位分享,供入门不久和新关注的同学参考。 1. 我是零基础,如何开始学习...

2909
来自专栏美团技术团队

Android插件化、热补丁中绕不开的ProGuard的坑

1716

扫码关注云+社区