博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(五)桥接模式
阅读量:6379 次
发布时间:2019-06-23

本文共 2763 字,大约阅读时间需要 9 分钟。

1.定义

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

2.介绍

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

3.UML类图

角色说明:

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

4.实现

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

4.1 创建实现化角色

定义一个衣服接口:

interface Clothes {        String getName();}

4.2 创建具体实现化角色

创建两种衣服类:校服和衬衫。

1 public class Uniform implements Clothes { 2  3      @Override 4      public String getName() { 5           return "校服"; 6      } 7 } 8  9 public class Shirt implements Clothes {10 11      @Override12      public String getName() {13           return "衬衫";14      }15 }

4.3 创建抽象化角色

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

1 public abstract class Person {2      Clothes mClothes;//持有衣服类的引用3 4      public void setClothes(Clothes clothes) {5          mClothes = clothes;6      }7 8      protected abstract void dress();//穿衣服9 }

4.4 创建具体抽象化角色

这里有两种角色穿衣服:学生和程序员。

1 public class Student extends Person { 2  3     @Override 4     protected void dress() { 5         System.out.println("学生穿上" + mClothes.getName()); 6     } 7 } 8  9 public class Coder extends Person {10 11     @Override12     protected void dress() {13         System.out.println("程序员穿上" + mClothes.getName());14     }15 }

4.5 客户端测试:

1 public void test() { 2         //创建各种衣服对象 3         Clothes uniform = new Uniform(); 4         Clothes shirt = new Shirt(); 5          6         //不同职业的人穿衣服 7         Person coder = new Coder(); 8         coder.setClothes(shirt); 9         coder.dress();10 11         System.out.println("--------------------------------------");12         Person student = new Student();13         student.setClothes(uniform);14         student.dress();15 16         System.out.println("--------------------------------------");17         student.setClothes(shirt);18         student.dress();19 }20 21 输出结果:22 23 程序员穿上衬衫24 --------------------------------------25 学生穿上校服26 --------------------------------------27 学生穿上衬衫

4.6 其他说明:

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

5. 应用场景

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

6. 优点

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

7. 缺点

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

8. Android中的源码分析

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

8.1 AbsListView 与 ListAdapter 之间的桥接模式

相关代码就不贴了,看下它们的UML类图就明白了。

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

8.2 其他

另外,Window 与 WindowManager 之间也是桥接模式。有兴趣的可以去看下源码体会体会。

 

转载于:https://www.cnblogs.com/ganchuanpu/p/7011712.html

你可能感兴趣的文章
Android于JNI调用列出的程序
查看>>
CSS3-border-radius 属性
查看>>
解决Activity启动黑屏和设置android:windowIsTranslucent不兼容activity切换动画的问题
查看>>
C#开发SQLServer的Geometry和Geography存储
查看>>
EBS R12.2应用层关闭脚本的执行过程
查看>>
js:深闭包(范围:上)
查看>>
使用POI导入小数变成浮点数异常
查看>>
司机福利!Uber即将可以自己选目的地接单啦!
查看>>
MOGODB REDIS
查看>>
[java] java 中Unsafe类学习
查看>>
P1739 表达式括号匹配
查看>>
3.1.4 模板字符串
查看>>
Qt 3D教程(二)初步显示3D的内容
查看>>
100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】
查看>>
compareTo返回值为-1 、 1 、 0 的排序问题
查看>>
Being a Good Boy in Spring Festival(杭电1850)(尼姆博弈)
查看>>
互联网+时代IT管理者的转型
查看>>
Linux系统调用--getrlimit()与setrlimit()函数详解【转】
查看>>
限制容器的 Block IO - 每天5分钟玩转 Docker 容器技术(29)
查看>>
cocos2dx下的A星算法
查看>>