《设计模式》桥接模式

基本介绍

定义

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

介绍

  • 桥接模式属于结构型模式。
  • 举个生活中的例子,一条数据线,一头USB接口的可以连接电脑、充电宝等等,另一头可以连接不同品牌的手机,通过这条数据线,两头不同的东西就可以连接起来,这就是桥接模式。

UML类图

桥接模式UML类图

角色说明:

  • Abstraction(抽象化角色):一般是抽象类,定义该角色的行为,同时保存一个对实现化角色的引用。
  • Implementor(实现化角色):接口或者抽象类,定义角色必需的行为和属性。
  • ConcreteImplementorA、ConcreteImplementorB(具体实现化角色):实现角色的具体行为。

具体实现

这里以穿衣服为例,不同职业的人可能要穿的衣服不一样。

1、创建实现化角色。定义一个衣服接口:

interface Clothes {
  String getName();
}

2、创建具体实现化角色。创建两种衣服类:校服和衬衫。

public class Uniform implements Clothes {
  @Override
  public String getName() {
    return "校服";
  }
}

public class Shirt implements Clothes {
  @Override
  public String getName() {
    return "衬衫";
  }
}

3、创建抽象化角色。定义一个人物类,有一个穿衣服的方法,并且持有衣服类的引用。即抽象化角色持有实现化角色的引用,可以调用实现化角色的方法,达到桥接的作用。

public abstract class Person {
  // 持有衣服类的引用
  Clothes mClothes;

  public void setClothes(Clothes clothes) {
    mClothes = clothes;
  }
  
  // 穿衣服
  protected abstract void dress();
}

4、创建具体抽象化角色。这里有两种角色穿衣服:学生和程序员。

public class Student extends Person {
  @Override
  protected void dress() {
    System.out.println("学生穿上" + mClothes.getName());
  }
}

public class Coder extends Person {
  @Override
  protected void dress() {
    System.out.println("程序员穿上" + mClothes.getName());
  }
}

5、客户端测试:

public void test() {
  // 创建各种衣服对象
  Clothes uniform = new Uniform();
  Clothes shirt = new Shirt();

  // 不同职业的人穿衣服
  Person coder = new Coder();
  coder.setClothes(shirt);
  coder.dress();

  System.out.println("--------------------------------------");
  Person student = new Student();
  student.setClothes(uniform);
  student.dress();

  System.out.println("--------------------------------------");
  student.setClothes(shirt);
  student.dress();
}

输出结果:

程序员穿上衬衫
--------------------------------------
学生穿上校服
--------------------------------------
学生穿上衬衫

6、其他说明:
通过上面的例子可以看到,我们分离了两端的变化。新增衣服和新增职业都变的非常简单。假如我们再增一个维度的变化,例如加个年龄来区分怎么办?这时我们就可以把Person类作为实现化角色,把不同年龄段作为抽象化角色,代码就不写了,有兴趣可以去实现一下。

模式总结

应用场景

  • 一个类存在两个或以上的独立维度的变化,且这些维度都需要进行拓展。
  • 不希望使用继承或因为多层次继承导致类的个数急剧增加时。
  • 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,可以通过桥接模式使他们在抽象层建立一个关联关系。

优点

  • 分离了抽象与实现。让抽象部分和实现部分独立开来,分别定义接口,这有助于对系统进行分层,从而产生更好的结构化的系统。
  • 良好的扩展性。抽象部分和实现部分都可以分别独立扩展,不会相互影响。

缺点

  • 增加了系统的复杂性。
  • 不容易设计,抽象与实现的分离要设计得好比较有难度。

Android中的源码分析

桥接模式在Android中的源码应用还是非常广泛的。比如AbsListViewListAdapter之间就是一个桥接模式。

1、AbsListViewListAdapter 之间的桥接模式
相关代码就不贴了,看下它们的UML类图就明白了。

AbsListView 与 ListAdapter 之间的桥接模式

这里AbsListView是抽象化角色,ListAdapter则是实现化角色。

2、其他
另外,WindowWindowManager 之间也是桥接模式。有兴趣的可以去看下源码体会体会。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 Android的设计模式系列文章介绍,欢迎关注,持续更新中: Android的设计模式-设计模式的六大原则一...
    四月葡萄阅读 11,022评论 2 12
  • 桥接模式(Bridge) 在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计...
    Acton_zhang阅读 3,165评论 0 1
  • 目录 本文的结构如下: 引言 什么是桥接模式 模式的结构 典型代码 代码示例 优点和缺点 适用环境 模式应用 一、...
    w1992wishes阅读 5,728评论 0 6
  • 晚景事顺多吉祥, 只叹风光近夕阳。 杖黎携酒访好友, 名山大川梦里藏。 (清风明月于十二月六号)
    清风明月冯耀杰阅读 1,292评论 0 7
  • 文/婉兮 1 我是2014年接触到直播的。 那时我还在上高中,正处于极度爱美却又极度缺钱的年纪。开账号是跟风而动,...
    婉xi阅读 8,799评论 15 50

友情链接更多精彩内容