【设计模式 - 6】之桥接模式(Bridge)
1、模式简介
举个例子,人、车和公路是三个维度,人开着车在公路上行驶,就是将这三个维度进行了关联。人分男人(Man)和女人(Woman),车分小轿车(Car)和公共汽车(Bus),公路分市区公路(Street)和高速公路(Speedway),那么如果我们不使用桥接模式的话,要模拟出所有情况,系统的架构应该是如下图所示的:
从图中可以很容易的看出,这个系统中的类太多了,需要对每种情况都进行考虑,而且如果系统中的维数一多,类中的类就会爆炸。为了解决这个问题,一种解决思路就是使用桥接模式。
桥接模式定义:
将抽象部分与实现部分分离,让它们都可以独立的变化。
桥接模式的适用情况:
当系统中的维数过多,类的个数随着维数的增多会急剧增加时。
桥接模式的优点:
- 实现了抽象和实现的分离;
- 有很好的扩展能力;
- 将不同维度放在同一个平面上;
- 实现细节对用户透明。
桥接模式的缺点:
不同维度的关联关系都被放在了抽象层,加大了系统设计的难度。
上面例子,经过桥接模式处理之后的UML图如下所示:
2、代码
2.1、需求
和上面的例子相似,只不过我们换一个例子:
一个系统中有三个维度,人(Person)包括男人(Man)和女人(Woman);画笔(Drawer)包括铅笔(Pencil)和钢笔(Pen);图形(Shape)包括圆形(Circle)和矩形(Rectangle)。搭建项目框架,使得最终的输出格式如“男人用铅笔画了一个圆形”的格式。
2.2、分析
这个项目的UML图如下图所示:
2.3、代码
Shape父类中的代码:
public abstract class Shape {
abstract void introduce();
}
Shape的一个子类Circle类中的代码:
public class Circle extends Shape {
@Override
void introduce() {
System.out.print("圆形");
}
}
Drawer父类中的代码:
public abstract class Drawer {
public Shape shape;
abstract void drawShape();
}
Drawer类的一个子类Pencil类中的代码:
public class Pencil extends Drawer {
@Override
void drawShape() {
System.out.print("用铅笔画了一个");
super.shape.introduce();
}
}
Person类中的代码:
public abstract class Person {
public Drawer drawer;
abstract void draw();
}
Person的一个子类Man类中的代码:
public class Man extends Person {
@Override
void draw() {
System.out.print("男人");
super.drawer.drawShape();
}
}
2.4、测试
测试类中的代码:
public class Test {
public static void main(String[] args) {
Shapecircle = new Circle();
Drawerpencil = new Pencil();
pencil.shape = circle;
Personman = new Man();
man.drawer = pencil;
man.draw();
System.out.println();
}
}
测试结果如下图所示:
最后贴出桥接模式的GitHub代码:【GitHub - Bridge】。
【设计模式 - 6】之桥接模式(Bridge)的更多相关文章
- Net设计模式实例之桥接模式( Bridge Pattern)
一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...
- 设计模式学习心得<桥接模式 Bridge>
说真的在此之前,几乎没有对于桥接模式的应用场景概念. 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来 ...
- IOS设计模式浅析之桥接模式(Bridge)
引言 在项目开发中,我们会遇到这样的一种场景:某些类型由于自身的逻辑,往往具有两个或多个维度的变化,比如说大话设计模式书中所说的手机,它有两个变化的维度:一是手机的品牌,可能有三星.苹果等:二是手机上 ...
- 设计模式入门之桥接模式Bridge
Abstraction:抽象部分的父类,定义须要实现的接口.维护对实现部分的引用,从而把实现桥接到Implementor中去 Implementor:实现部分的接口 RefinedAbstractio ...
- 《JAVA设计模式》之桥接模式(Bridge)
在阎宏博士的<JAVA与模式>一书中开头是这样描述桥梁(Bridge)模式的: 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式. ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- python 设计模式之桥接模式 Bridge Pattern
#写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
- 桥接模式(Bridge Pattern)
1,定义 桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...
随机推荐
- 深入理解QStateMachine与QEventLoop事件循环的联系与区别
最近一直在倒腾事件循环的东西,通过查看Qt源码多少还是有点心得体会,在这里记录下和大家分享.总之,对于QStateMachine状态机本身来说,需要有QEventLoop::exec()的驱动才能支持 ...
- CoffeeScript飞一样的写javascript
之前看到同事在使用coffeescript写js,当我看到那简介的coffee文件,就深深的被coffescript吸引了,简洁的语法,熟练之后会大大提升javascript的开发速度,写脚本也能像飞 ...
- php邮箱找回密码功能
原理很简单: 用户找回密码的时候,填写用户名,程序得到用户名便可以去数据库取出用户对应的密码以及当时填写的邮箱, 根据用户名和密码生成一个key=md5(username+password),然后$s ...
- 求算符文法的FIRSTVT集的算法
原理 数据结构 G = {'key':[v1,v2,v3],'key':[v1,v2,v3]}; VN = []; Vt = []; FirstVT = {'key':[v1,v2,v3],'key' ...
- vscode编写插件详细过程
前言 之前编写了一个vscode插件用vscode写博客和发布,然后有园友要求写一篇来介绍如何开发一个vscode扩展插件,或者说介绍开发这个插件的过程.然而文章还没有写,园子里面已经有人发布一个文章 ...
- WPF学习之路初识
WPF学习之路初识 WPF 介绍 .NET Framework 4 .NET Framework 3.5 .NET Framework 3.0 Windows Presentation Found ...
- Spring MVC源码分析(续)——请求处理
转自:http://blog.csdn.net/shi1122/article/details/8041017 (转移位置了,时光隧道:http://www.jmatrix.org/spring/50 ...
- [HDOJ - 5208] Where is Bob 【DFS+按位贪心】
题目链接:HDOJ - 5208 题目分析 使用按位贪心的思想,即从高位向低位枚举,尽量使这一位的答案为 1 . 我们使用 DFS ,每次就是对于 [l1, r1] [l2, r2] x 进行处理 ...
- Netty高性能之道
1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用.相比于 ...
- Qt中事件处理的方法(图文并茂,仔细看看)
http://blog.csdn.net/qing666888/article/details/14111271 http://blog.csdn.net/qing666888/article/det ...