桥接模式

蜡笔中颜色和型号之间存在耦合

毛笔中,颜色和型号解耦了

如果软件系统中某个类存在两个独立变化的维度,桥接模式可以将两个维度分离出来

角色

抽象类

扩充抽象类

实现类接口

提供基本操作

抽象类定义的接口会做更多更负责的操作

使用关联关系,替代继承关系

具体实现类

面向对象思想

单一职责原则

开闭原则

合成复用原则

里氏替换原则

依赖倒转原则

毛笔案例

毛笔型号维度

大毛笔

中毛笔

小毛笔

型号是毛笔的抽象部分,颜色是毛笔的实现部分

毛笔颜色维度

黑色

红色

灰色

蓝色

...

毛笔和颜色之间是聚合关系

图片案例

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 桥接模式_JAVA设计模式之【桥接模式】相关推荐

  1. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  2. java解耦的模板模式_Java 设计模式(9) —— 模板模式

    一.模板模式 封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现.模板模式可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板模式 二.示例 泡咖啡与泡茶: 泡咖啡的步骤: 水 ...

  3. Java创新型模式_java设计模式--创建型模式(一)

    2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...

  4. 格力电器Java面试题_JAVA设计模式学习--工厂模式

    今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...

  5. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  6. java策略模式_Java设计模式之策略模式详解

    本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Def ...

  7. java抽象工厂模式_JAVA设计模式-抽象工厂模式

    定义 抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构. 抽象工厂模 ...

  8. java bridge 模式_Java设计模式之桥模式(Bridge模式)介绍

    Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...

  9. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

  10. java模板方法模式_java设计模式(模板方法模式)

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

最新文章

  1. [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询
  2. 20、DELETE:删除数据
  3. stm32串口学习(一)
  4. HALCON示例程序autobahn高速公路车道识别程序剖析
  5. opencv-原图基础上添加指定颜色
  6. 几行代码搞定树形文本转XML和JSON
  7. 漫步最优化二十——下降函数
  8. 接口测试工具--apipost如何取消json参数中转义字符
  9. 车辆属性识别、车型识别
  10. 摄影基础知识: 曝光补偿完全指南
  11. 微信消息模板——巨坑
  12. 通过Frp内网穿透和Nginx反向代理实现不带端口号访问家里内网服务器网站
  13. 分享一个360加固脱壳模拟器
  14. 一次哔哩哔哩面试经历
  15. 安氏书店管理软件——您的首选
  16. 【面试】面试之哒哒英语
  17. inprivate浏览是什么意思_如何使IE浏览器打开默认是InPrivate浏览
  18. C#“同步调用”、“异步调用”、“异步回调”
  19. Windows下安装zookeeper
  20. Django管理多个APP且在后台显示自定义APP的名称

热门文章

  1. `>>`(有符号右移) 和 `>>>`(无符号右移)的区别
  2. 【SpringBoot实战】员工部门管理页面,增删改查,含源码
  3. 【MS Word技巧】word如何批量把括号内字体变绿?
  4. C语言课设 成绩管理程序
  5. java stream中Collectors的用法
  6. Google Spanner 论文笔记
  7. Effective Java之避免创建不必要的对象(五)
  8. Java的io类的使用场景
  9. shell脚本命令set
  10. hdu4004 The Frog's Games 二分