声明:迁移自本人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. 019.CI4框架CodeIgniter辅助函数类之:Array数组查询

    01. 数组辅助函数,可以方便的查看数组内部的成员,用法如下图所示: <?php namespace App\Controllers; class Hello extends BaseContr ...

  2. 09 MySQL字符集

    字符集的选择     1.数据库方面最流行的是UTF-8     2.如果只考虑支持汉字,那么使用GBK,毕竟GBK下,每个汉字只占用2个字节,而UTF-8需要3个字节.     3.如果需要做大量的 ...

  3. 基础知识 SafeSEH DEP ASLR SEHOP

    大多是0day书上抄的 1.SafeSEH 机制: 首先:内存中有SEH表的备份(加密过的) 在调用异常出来函数前,RtlDispatchException()函数中的行为: Ⅰ.检查异常处理链是否位 ...

  4. ROM与RAM

    今天小姐姐来问我关于ROM.RAM和Flash的区别,我给她大致的说了一下名称和作用.可人家说她知道这玩意的名字,希望我能够接地气的解释一下什么是ROM.RAM.FLASH…… 这就把我难住了 ≧ ﹏ ...

  5. 六、JavaScript之调用外部JavaScript文件

    一.外部JavaScript文件,不需要写<SCRIPT>标签,myScript.js代码如下: 二.index.php代码如下 三.运行效果如下 四.点击之后 myScript.php如 ...

  6. 086-PHP数组按数字排序和按字母排序

    <?php $arr=array(2,54,167,'a','A','12'); //定义一个数组 echo '数组排序之前的信息:<br />'; print_r($arr); / ...

  7. postgrepSQL数据库创建二级分区表

    数据库版本:version 10 以非继承的形式创建分区表,一级分区是城市,二级分区是天:指定分区有两种形式,RANGE和LIST,如果使用RANGE在创建分区语句中是通过FOR VALUES FRO ...

  8. HTML布局梳理

    布局是一个很艺术的话题,即使是相同的HTML文档结构,但加上不同的css样式就会呈现出不同的效果.接下来就来总结一下html常用的布局. 一.布局的分类: 根据页面板块分类: 页面的板块主要是根据栏目 ...

  9. c++ 配置ffmpeg

    本教程只针对windows64/32+vs2013环境配置第一步 :配环境1.打开ffmpeg官网中编译好的windows版本http://ffmpeg.zeranoe.com/builds/64位w ...

  10. 16 react 发送异步请求获取数据 和 使用Redux-thunk中间件进行 ajax 请求发送

    1.发送异步请求获取数据 1.引入 axios ( 使用 yarn add axios 进行安装 ) import axios from 'axios'; 2. 模拟 在元素完成挂载后加载数据 并初始 ...