Bridge???

Bridge的意思是“桥梁”。就像在现实世界中,桥梁的功能是将河流的两侧连接起来一样,Bridge模式的作用也是将两样东西连接起来,它们分别是类的功能层次结构和类的实现层次结构。

  • 父类通过声明抽象方法来定义接口(APl):需要使用继承强关联方式,那么必须使用中间层抽象子类来实现方法的可变性。所以在聚合关系中考虑引入DisplayImpl 抽象层
  • 子类通过实现具体方法来实现接口(APl):这种层次结构被称为“类的实现层次结构”。当我们以其他方式实现AbstractClass时,例如要实现一个AnotherConcreteClass时,类的层次结构会稍微发生一些变化。

理解职责

通俗理解办法:Bridge 是连通桥梁两端 是具体抽象层 与具体的实现类 建立关系的必然。

需要明确的:序中依赖于操作系统的部分划分为Windows版、Macintosh版、Unix版,那么我们就可以用Bridge模式中的“类的实现层次结构”来表现这些依赖于操作系统的部分。也就是说,我们需要编写一个定义这些操作系统的共同接口(API)的Implementor角色,然后编写Windows版、Macintosh版、Unix版的3个Concretelmplementor角色。这样一来,无论在“类的功能层次结构”中增加多少个功能,它们都可以工作于这3个操作系统上。

职责实现功能:完成不同功能的字符显示

在桥的哪一侧|名字|说明

|类的功能层次结构 ====>|Display|负责“显示”的类

类的功能层次结构 ====>|CountDisplay|增加了“只显示规定次数”这一功能的类

类的实现层次结构 ====>|DisplayImpl 负责“显示”的类

|类的实现层次结构 ====>|stringDisplayImp1“用字符串显示”的类

Main测试程序行为 ====>的类

UML

Code

Display:


public class Display { /**
* 交给抽象子类去实现
*/
private DisplayImpl displayimpl; public Display(DisplayImpl displayimpl) {
this.displayimpl = displayimpl;
} protected void open(){
displayimpl.rawOpen();
} protected void printr(){
displayimpl.rawPrint();
} protected void close(){
displayimpl.rawClose();
} public void display(){
open();
printr();
close();
}
}

假设需求改变 我们需要在Display基础上增加功能:


public class randomDisplay extends Display { public randomDisplay(DisplayImpl displayimpl) {
super(displayimpl);
} public void randomDisplay(int times) {
Random random = new Random();
int len=random.nextInt(times);
super.open();
for (int i = 0; i < len; i++) {
super.printr();
}
super.close();
}
} public class CountDisplay extends Display { public CountDisplay(DisplayImpl displayimpl) {
super(displayimpl);
} public void multiDisplay(int times){
super.open();
for (int i = 0; i < times; i++) {
super.printr();
}
super.close();
}
}

书上没有明确这个 称之为 抽象实现者 :我暂且称之为 Bridge器 必须抽象


public abstract class DisplayImpl { /**
* 作为bridge 强关联 解耦的关键性 地方 不可以为 class 必须为abstract class
*/
public abstract void rawOpen(); public abstract void rawPrint(); public abstract void rawClose();
}

测试:


**/
public class MainT { public static void main(String[] args) { Display display=new Display(new StringDisplayImpl("bridge design method")); Display display1=new CountDisplay(new StringDisplayImpl("on first bridge")); display.display(); display1.display(); ((CountDisplay) display1).multiDisplay(3); // 随机次数
Display display2=new randomDisplay(new StringDisplayImpl("two sencond bridge")); ((randomDisplay) display2).randomDisplay(5); }
}

最新文章

  1. 写给自己:修改配置文件一定要cp一个.bak
  2. SSH整合时执行hibernate查询报错:java.lang.ClassCastException: com.ch.hibernate.Department_$$_javassist_0 cannot be cast to javassist.util.proxy
  3. 支持断线重连、永久watcher、递归操作并且能跨平台(.NET Core)的ZooKeeper异步客户端
  4. ElasticSearch基本学习
  5. 转换Excel表格到MarkDown:exceltk
  6. IOS 学习笔记之UI
  7. 33 网络相关函数(一)——live555源码阅读(四)网络
  8. kvm虚拟机安装
  9. windows命令行(Command Prompt / Console)字体设置
  10. centos安装apache
  11. ASP.NET中的事件处理
  12. HDU-4720 Naive and Silly Muggles 圆的外心
  13. struts2,hibernate,spring整合笔记(3)
  14. Unity 之 Redux 模式(第一篇)—— 人物移动
  15. poj3617Best Cow Line
  16. Java课程设计 学生基本信息管理系统 团队博客
  17. Oracle 10g RAC OCR、Voting disk更换
  18. Eclipse+Maven+Scala Project+Spark | 编译并打包wordcount程序
  19. LeetCode-37.Sudok Solver
  20. Linux系统管理员命令:sudo

热门文章

  1. java入门了解05
  2. Android USB 开发详解
  3. chrome浏览器常用快捷键
  4. listen 73
  5. codeforces 558B B. Amr and The Large Array(水题)
  6. ORA-21561: OID generation failed
  7. poj1637 Sightseeing tour[最大流+欧拉回路]
  8. ACM学习历程—Codeforces 446C DZY Loves Fibonacci Numbers(线段树 &amp;&amp; 数论)
  9. POJ1502(最短路入门题)
  10. javascript的三个函数