声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635

桥接模式可以和排列组合关联起来理解,一个对象有多种不通种类的属性,如attributeA1,attributeA2,attributeB1,attributeB2,attributeB3。可以组装出23=6种对象。作为服务的提供方,应该怎样提供这种服务给客户端呢?是代码中写死23中组合还是交给客户端一定的灵活性,使客户端可以灵活组装出自己想要的对象呢?无论是代码的可扩展性还是从代码的简洁性来讲,我们都会选择后者。(注:这是作者第一次在设计模式讲解中引入了服务端、客户端的说法,事实上,设计模式的完成一半都要涉及服务端、客户端的说法,如果只存在服务方而客户端的配置,大部分的设计模式是没有意义的。)
以显示字体为例,不同的字体在同样的操作系统上会显示不同的样式。同样的字体在不通的操作系统上也可能显示不同的样式。那这就是很典型的可以使用Bridge模式的场景。

字体抽象类

package com.designpattern.bridge;

/**
* 字体抽象类
*/
public abstract class Font {
protected FontImplOSPlatform fontImplOSPlatform; public abstract void DrawText(String text); protected FontImplOSPlatform getFontOSPlatform(String type) {
if(type.equals("Windows")) {
return new FontImplOnWindows();
} else if(type.equals("Linux")) {
return new FontImplOnLinux();
} else {
return new FontImplOnOtherOS();
}
}
}

宋体实现类

package com.designpattern.bridge;

/**
* 宋体
*/
public class SongTypeFaceFont extends Font {
public SongTypeFaceFont(String osType) {
fontImplOSPlatform = getFontOSPlatform(osType);
} public void DrawText(String text) {
System.out.println("will render \"" + text + "\"");
System.out.println("The text is Song style text!");
fontImplOSPlatform.DrawTextOnOS();
}
}

楷书实现类

package com.designpattern.bridge;

/**
* 楷书
*/
public class RegularStyleFont extends Font {
public RegularStyleFont(String osType) {
fontImplOSPlatform = getFontOSPlatform(osType);
} public void DrawText(String text) {
System.out.println("will render \"" + text + "\"");
System.out.println("The text is regular style text!");
fontImplOSPlatform.DrawTextOnOS();
}
}

操作系统字体实现接口类

package com.designpattern.bridge;

public interface FontImplOSPlatform {
void DrawTextOnOS();
}

Windows实现字体渲染

package com.designpattern.bridge;

/**
* 字体在Windows上的实现
*/
public class FontImplOnWindows implements FontImplOSPlatform {
public void DrawTextOnOS() {
System.out.println("The text will be rendered on Windows");
}
}

Linux实现字体渲染

package com.designpattern.bridge;

/**
* 字体在Linux上的实现
*/
public class FontImplOnLinux implements FontImplOSPlatform {
public void DrawTextOnOS() {
System.out.println("The text will be rendered on Linux");
}
}

其他操作系统实现字体渲染

package com.designpattern.bridge;

/**
* 字体在其他操作系统上的实现
*/
public class FontImplOnOtherOS implements FontImplOSPlatform {
public void DrawTextOnOS() {
System.out.println("The text will be rendered on Other OS");
}
}

测试类(客户端类)

   package com.designpattern.bridge;

public class TestBridge {
public static void main(String[] args) {
Font myText = new SongTypeFaceFont("Windows");
myText.DrawText("中国");
System.out.println(); myText = new SongTypeFaceFont("Linux");
myText.DrawText("中国");
System.out.println(); myText = new RegularStyleFont("Windows");
myText.DrawText("中国");
System.out.println(); myText = new RegularStyleFont("Linux");
myText.DrawText("中国");
System.out.println();
}
}

运行结果如下

will render "中国"
The text is Song style text!
The text will be rendered on Windows will render "中国"
The text is Song style text!
The text will be rendered on Linux will render "中国"
The text is regular style text!
The text will be rendered on Windows will render "中国"
The text is regular style text!
The text will be rendered on Linux

完。

设计模式讲解4:Bridge模式源码的更多相关文章

  1. 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理

    1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...

  2. 设计模式课程 设计模式精讲 7-3 建造者模式源码解析(jdk+guava+spring+mybaties)

    1 源码解析 1.1 jdk解析 1.2 guava解析 1.3 spring解析 1.4 mybaties解析 1 源码解析 1.1 jdk解析 String public StringBuilde ...

  3. 1个月连载30个设计模式真实案例(附源码),挑战年薪60W不是梦

    本文所有内容均节选自<设计模式就该这样学> 本文自2012年10月29日起持续连载,请大家持续关注.... 序言 Design Patterns: Elements of Reusable ...

  4. 设计模式-简单工厂Coding+jdk源码解析

    感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...

  5. 【一起学源码-微服务】Nexflix Eureka 源码十二:EurekaServer集群模式源码分析

    前言 前情回顾 上一讲看了Eureka 注册中心的自我保护机制,以及里面提到的bug问题. 哈哈 转眼间都2020年了,这个系列的文章从12.17 一直写到现在,也是不容易哈,每天持续不断学习,输出博 ...

  6. ACE - Reactor模式源码剖析及具体实现(大量源码慎入)

    原文出自http://www.cnblogs.com/binchen-china,禁止转载. 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于 ...

  7. Android Doze模式源码分析

    科技的仿生学无处不在,给予我们启发.为了延长电池是使用寿命,google从蛇的冬眠中得到体会,那就是在某种情况下也让手机进入类冬眠的情况,从而引入了今天的主题,Doze模式,Doze中文是打盹儿,打盹 ...

  8. Flink源码阅读(一)——Flink on Yarn的Per-job模式源码简析

    一.前言 个人感觉学习Flink其实最不应该错过的博文是Flink社区的博文系列,里面的文章是不会让人失望的.强烈安利:https://ververica.cn/developers-resource ...

  9. 硬核讲解 Jetpack 之 LifeCycle 源码篇

    前一篇 硬核讲解 Jetpack 之 LifeCycle 使用篇 主要介绍了 LifeCycle 存在的意义,基本和进阶的使用方法.今天话不多说,直接开始撸源码. 本文基于我手里的 android_9 ...

随机推荐

  1. 049、Java中使用switch判断,不加入break时的操作

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  2. Java 解决Emoji表情过滤问题

    Emoji表情从三方数据中获取没有过滤,导致存入DB的时候报错. 原因: UTF-8编码有可能是两个.三个.四个字节.Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去 ...

  3. HDU 5501:The Highest Mark 01背包

    The Highest Mark  Accepts: 71  Submissions: 197  Time Limit: 2000/1000 MS (Java/Others)  Memory Limi ...

  4. POJ 3983:快算24

    快算24 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4791   Accepted: 2930 Description ...

  5. 51nod:天堂里的游戏

    天堂里的游戏 李陶冶 (命题人) System Message (测试) 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 多年后,每当Noder看到吉普赛人,就会想起那个遥远的下午. ...

  6. Kafka--Kafka简述

    Kafka的诞生 Kafka最初是LinkedIn的一个内部基础设施系统.我们发现,虽然有很多数据库和系统可以用来存储数据,但在我们的架构里,刚好缺一个可以帮助处理持续数据流的组件. 我们希望能够把数 ...

  7. [YOLO]《YOLO9000:Better, Faster, Stronger》笔记

    一.简单介绍 YOLO9000(也叫YOLO v2),主要是在YOLO v1的基础上做了改进,而且效果还是比较显著的,在原论文中,作者提到的改进大致包括两个工作: 1.检测性能上的改进,提出了YOLO ...

  8. 第三篇:Vue指令

    Vue指令 1.文本指令相关 v-*是Vue指令,会被vue解析,v-text="num"中的num是变量(指令是有限的,不可以自定义) v-text是原样输出渲染内容,渲染控制的 ...

  9. VS Code 单文件、多文件(工程) 配置文件

    针对于单文件编译运行,需要在代码文件夹下建立子文件夹 .vscode ,并放置三个文件 1:c_cpp_properties.json,注意更改7.8.11行的路径 { "configura ...

  10. Elasticsearch 搜索数据

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...