【设计模式 - 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),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...
随机推荐
- Object之魔术函数__call() 处理错误调用
在提到__call之前,先来看一个实例的测试结果,以便更好地去了解__call方法的作用.上代码: <?php class Person{ function say(){ echo " ...
- php之面向对象(2)
注意:看这篇文章之前建议看看之前的文章,因为内容之间衔接性比较强.勿喷.. 面向对象,是一种思维模式的名字,并不是指某种特定的写法,面向对象简称oop,思路的核心在于:什么时候 什么东西 做什么. 编 ...
- 一些static_cast const_cast
static_cast:干杂活的,那三个都有各自的专有用途,那三个不做的都由这个转型符来做,只要它能做的,用C语法的强制类型转换运算符也一定能够完成:但话又说回来了,C强制类型转换能做的,它可不一定都 ...
- python 中调用windows系统api操作剪贴版
# -*- coding: utf-8 -*- ''' Created on 2013-11-26 @author: Chengshaoling ''' import win32clipboard a ...
- 为何要fork()两次来避免产生僵尸进程??
最近安装书上说的,开始搞多进程了..看到了一个好帖子,学习学习 http://blog.sina.com.cn/s/blog_9f1496990100y420.html 首先我们要明白,为什么要避免僵 ...
- 学习Swift -- 构造器(下)
构造器(下) 可失败的构造器 如果一个类,结构体或枚举类型的对象,在构造自身的过程中有可能失败,则为其定义一个可失败构造器,是非常有必要的.这里所指的“失败”是指,如给构造器传入无效的参数值,或缺少某 ...
- jdbc 安装驱动
在使用JDBC编程时需要连接数据库,导入JAR包是必须的,导入其它的jar包方法同样如此,导入的方法是 打开eclipse 1.右击要导入jar包的项目,点properties 2.左边选择java ...
- Sed&awk笔记之sed篇
http://blog.csdn.net/a81895898/article/details/8482387 Sed是什么 <sed and awk>一书中(1.2 A Stream Ed ...
- 【CF】244C Checkposts
题目需要求啥很明确了.主要思想是先计算机联通块,然后每个块内找到一个最小值(以及该值的次数).最小值和结果1,次数乘积为结果2.联通块tarjan可解. /* 427C */ #include < ...
- lambda -- Filter Java Stream to 1 and only 1 element
up vote10down votefavorite I am trying to use Java 8 Streams to find elements in a LinkedList. I wan ...