桥接模式
蜡笔中颜色和型号之间存在耦合
毛笔中,颜色和型号解耦了
如果软件系统中某个类存在两个独立变化的维度,桥接模式可以将两个维度分离出来
角色
抽象类
扩充抽象类
实现类接口
提供基本操作
抽象类定义的接口会做更多更负责的操作
使用关联关系,替代继承关系
具体实现类
面向对象思想
单一职责原则
开闭原则
合成复用原则
里氏替换原则
依赖倒转原则
毛笔案例
毛笔型号维度
大毛笔
中毛笔
小毛笔
型号是毛笔的抽象部分,颜色是毛笔的实现部分
毛笔颜色维度
黑色
红色
灰色
蓝色
...
毛笔和颜色之间是聚合关系
图片案例
Image充当抽象类
子类JPGImage,PNGImage、BMPImage和GIFImage充当扩充抽象类
ImageImp充当实现类接口
子类WindowsImp、LinuxImp、UnixImp充当具体实现类
像素辅助类,Matrix,不同操作系统提供不同的方式显示像素矩阵
桥接模式可以和适配器模式结合使用

1.图片实现类接口

package Bridge;

/**
* Created by e550 on 2016/10/3.
*/
public interface ImageImp {
public void doPaint(Matrix m);
}

2.图片抽象类

package Bridge;

/**
* Created by e550 on 2016/10/3.
*/
abstract class Image {
protected ImageImp imp;
public void setImageImp(ImageImp imp) {
this.imp = imp;
} public abstract void parseFile(String fileName);
}

3.图片扩充抽象类

JPG

package Bridge;

/**
* Created by e550 on 2016/10/3.
*/
public class JPGImage extends Image{
public void parseFile(String fileName) {
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为JPG");
}
}

PNG

package Bridge;

/**
* Created by e550 on 2016/10/3.
*/
public class PNGImage extends Image{
public void parseFile(String fileName) {
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为PNG。");
}
}

GIF

package Bridge;

/**
* Created by e550 on 2016/10/3.
*/
public class GIFImage extends Image{
public void parseFile(String fileName) {
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为GIF。");
}
}

BMP

package Bridge;

/**
* Created by e550 on 2016/10/3.
*/
public class BMPImage extends Image{
public void parseFile(String fileName) {
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为BMP。");
}
}

4.具体实现类

Windows

package Bridge;

/**
* Created by e550 on 2016/10/3.
*/
public class WindowsImp implements ImageImp{
public void doPaint(Matrix m) {
//调用Windows系统的绘制函数绘制像素矩阵
System.out.println("在Windows操作系统中显示图像:");
}
}

Linux

package Bridge;

/**
* Created by e550 on 2016/10/3.
*/
public class LinuxImp implements ImageImp{
public void doPaint(Matrix m) {
//调用Windows系统的绘制函数绘制像素矩阵
System.out.println("在Linux操作系统中显示图像:");
} }

Unix

package Bridge;

/**
* Created by e550 on 2016/10/3.
*/
public class UnixImp implements ImageImp{
public void doPaint(Matrix m) {
System.out.println("在Unix操作系统中显示图像:");
}
}

5.客户端

package Bridge;

/**
* Created by e550 on 2016/10/3.
*/
public class Client {
public static void main(String args[]) {
Image image;
ImageImp imp;
image = new GIFImage();
imp = new LinuxImp();
image.setImageImp(imp);
image.parseFile(" 日出美景");
}
}

执行结果

在Linux操作系统中显示图像:

日出美景,格式为GIF。

再看一个笔的例子

1.Color接口

package Bridge.PenColor;

/**
* Created by e550 on 2016/10/3.
*/
public interface Color {
void bepaint(String penType,String name);
}

2.Pen抽象类

package Bridge.PenColor;

/**
* Created by e550 on 2016/10/3.
*/
public abstract class Pen {
protected Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void draw(String name);
}

3.Color接口实现

package Bridge.PenColor;

/**
* Created by e550 on 2016/10/3.
*/
public class Black implements Color{
public void bepaint(String penType,String name) {
System.out.println(penType + "黑色的" + name + ".");
}
}
package Bridge.PenColor;

/**
* Created by e550 on 2016/10/3.
*/
public class Blue implements Color{
public void bepaint(String penType,String name) {
System.out.println(penType + "蓝色的" + name + ".");
}
}

4.Pen抽象类实现

package Bridge.PenColor;

/**
* Created by e550 on 2016/10/3.
*/
public class BigPen extends Pen{
public void draw(String name) {
String penType="大号毛笔绘制";
this.color.bepaint(penType,name);
}
}
package Bridge.PenColor;

/**
* Created by e550 on 2016/10/3.
*/
public class MiddlePen extends Pen{
public void draw(String name) {
String penType = "中型笔绘制";
this.color.bepaint(penType,name);
}
}
package Bridge.PenColor;

/**
* Created by e550 on 2016/10/3.
*/
public class SmallPen extends Pen{
public void draw(String name) {
String penType = "小型笔绘制";
this.color.bepaint(penType,name);
}
}

5.客户端

package Bridge.PenColor;

/**
* Created by e550 on 2016/10/3.
*/
public class Client {
public static void main(String args[]) {
Color color;
Pen pen;
color = new Blue();
pen = new BigPen();
pen.setColor(color);
pen.draw("鲜花");
}
}

执行结果

大号毛笔绘制蓝色的鲜花

JAVA设计模式之【桥接模式】的更多相关文章

  1. java设计模式7——桥接模式

    java设计模式7--桥接模式 1.桥接模式介绍 桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立的变化.它是一种对象结构型模式,又称为柄体模式或接口模式. 2.解决问题 2.1.将复杂的组合 ...

  2. java设计模式之桥接模式

    桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的 ...

  3. Java设计模式:桥接模式

    问题提出 生活中有很多事物集合,设为A1,A2......Am ,而每个事物都有功能F1,F2....Fn. 例如邮局的发送业务.简单模拟有两类事物:信件和包裹,均有平邮和挂号邮寄功能.程序设计中如何 ...

  4. Java设计模式应用——桥接模式

    性能管理系统中,数据产生后需要经过采集,汇聚,入库三个流程,用户才能查询使用. 采集可以是snmp采集,也可以是ems采集:汇聚可以使storm汇聚,也可以是spark汇聚:入库可以是hdfs入库,也 ...

  5. java设计模式之-----桥接模式

    一.概念定义 将抽象部分和实现部分分离,使他们都可以独立的变化.(这句话有点抽象啊..) 在软件系统中,某种类型由于自身逻辑,具有多个维度的变化,如何利用面向对象的技术来使得该类型沿着多方向变化,而又 ...

  6. JAVA设计模式之桥接模式(bridge)

    桥接模式: 分离抽象与具体实现,让他们可以独自发展,防止类爆炸 场景: 过年走亲戚是我们中国人传统的习俗,走亲戚那就少不了要买东西(苹果,牛奶等等),这些具体的东西就是具体的类 蒙牛牛奶,有机苹果,有 ...

  7. 八戒转世投胎竟然是Java设计模式:桥接模式

    目录 示例 代码实例 桥接模式 定义 意图 主要解决问题 何时使用 优缺点 八戒转世投胎的故事 示例 请开发一个画图程序,可以画各种颜色不同形状的图形,请用面向对象的思 想设计图形 分析: 1.比如有 ...

  8. java面试题之----jdbc中使用的设计模式(桥接模式)

    1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...

  9. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  10. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

随机推荐

  1. BZOJ 2124: 等差子序列 线段树维护hash

    2124: 等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一 ...

  2. BZOJ:3441 乌鸦喝水

    bzoj:3441 乌鸦喝水 题目传送门 Description 一只乌鸦在自娱自乐,它在面前放了n个有魔力的水缸,水缸里装有无限的水. 他准备从第1个水缸飞到第n个水缸,共m次.在飞过一个水缸的过程 ...

  3. Core Bluetooth的基本常识

    每个蓝牙4.0设备都是通过服务(Service)和特征(Characteristic)来展示自己的 一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征 特征是与外界交互的最小单位 比如说,一 ...

  4. .NET Core 开发:永远的Hello Word

    从.NET Core发布到现在已经很长一段时间了,园子里的各路大神也和它打的火热,本着与时俱进,啥火学啥的原则,我也开始了我的.NET Core学习之旅. 简介 .NET从2002年发行到现在,从呱呱 ...

  5. 【转】sql 一对多情况下 Group by分组 结果多列合并

    部分原始表数据 需求: 按routineId进行group分组 初步想法(错误): select r * from autowork.dbo.PartOnRoutine where routineId ...

  6. Swagger中添加Token验证

    1.该连接链接到api中基本的swagge功能:http://www.cnblogs.com/hhhh2010/p/5234016.html 2.在swagger中使用验证(这里使用密码验证模式)ht ...

  7. 【翻译】前景img-sprites, 高对比模式分析

    ->译文,原文在这里<- 本文地址: http://www.cnblogs.com/blackmanba/p/img-sprites-high-contrast.html或者http:// ...

  8. ZBrush软件特性之Edit

    ZBrush®中的Edit调控板控制撤销和重做命令,它有一或两个命令设置将根据Tool工具调控板当前选择的工具而定,默认配置的命令仅有文档编辑,不过当激活一个3D工具,只针对这个工具的两个按钮设置变成 ...

  9. 一个完整的Flexbox指南(转载)

    本文由大漠根据Chris Coyier的<A Complete Guide to Flexbox>所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点.如需转载此 ...

  10. 堆————数据流的第k个大的元素

    解题思路 一般地,堆和堆排序——解决 "贪心算法及其类似问题" 的利器. # 思路:我们可以用一个小根堆来做,并且限制堆的大小为k,初始化时把nums的每个数都push到堆中,如果 ...