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

相关文章

来自专栏Java3y

Java锁机制了解一下

2156
来自专栏ImportSource

源码走读-从JedisCluster的设计来发现对象池的奥秘

JedisCluster究竟是如何获得一个connection的?内部对象池又是如何工作的?

813
来自专栏开发 & 算法杂谈

PAT Advanced 1067

Given any permutation of the numbers {0, 1, 2,..., N-1}, it is easy to sort the...

762
来自专栏帅小子的日常

redis在java客户端的操作

2566
来自专栏ml

C++继承与派生(原理归纳)

   1.   C++继承与java不同,java遵循单继承,但java的接口为其不足做了很好的弥补了。 C++则是灵活的多,为多继承。即一个C++类可以同时继...

3124
来自专栏前端那些事

起步 - 从场景中看父子组件间通信

组件间通信是组件开发的,我们既希望组件的独立性,数据能互不干扰,又不可避免组件间会有联系和交互。 在vue中,父子组件的关系可以总结为props down,ev...

1949
来自专栏大内老A

ASP.NET MVC下的异步Action的定义和执行原理

Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controll...

2115
来自专栏文渊之博

pyspark 内容介绍(一)

pyspark 包介绍 子包 pyspark.sql module pyspark.streaming module pyspark.ml package py...

4286
来自专栏菩提树下的杨过

db4o 7.4 for .net3.5试用手记

db4o虽然出来很久了,一直没怎么关注,今天随手试了下,对于小型应用还是不错的,至少省去了ORM的麻烦,一切皆对象,一切都变得那么自然。 下载地址:http:/...

1759
来自专栏大闲人柴毛毛

三分钟理解“中介者模式”——设计模式轻松掌握

中介者模式的官方定义: 中介者模式使用一个中介对象来封装一系列对象的交互,从而使各对象不需要显式的相互引用,从而使得对象我们耦合松散,而且可以独立地改变对象之间...

35711

扫码关注云+社区