示例

请开发一个画图程序,可以画各种颜色不同形状的图形,请用面向对象的思

想设计图形

分析:

1、比如有红、黄、蓝三种颜色

2、形状有方形、圆、三角形

3、圆可以是红圆、黄圆、蓝圆



从上面可以看到,变化的地方有两个:

1、形状

2、颜色

任其在两个维度各自变化,为这两个维度搭个桥,让它们可以融合在一起,就是桥接模式,那么该如何搭呢?

需要从两个地方入手:

1:抽象

分别对各个维度进行抽象,将共同部分抽取出来



2:组合

将抽象组合在一起(桥接)

代码实例

抽象出形状和颜色,对应的类如下:

形状抽象类:持有颜色实例

public abstract class Shape {

    protected Color color;

    public Shape(Color color) {
this.color = color;
} /** 画图形 */
abstract void draw();
}

颜色接口:

public interface Color {

    /** 上色 */
void coloring();
}

不同的形状对应的实现类:

public class Circle extends Shape {

    public Circle(Color color) {
super(color);
} @Override
public void draw() {
this.color.coloring();
System.out.print("圆");
}
}
public class Rect extends Shape {

    public Rect(Color color) {
super(color);
} @Override
public void draw() {
this.color.coloring();
System.out.print("矩形");
}
}
public class Triangle extends Shape {

    public Triangle(Color color) {
super(color);
} @Override
public void draw() {
this.color.coloring();
System.out.print("三角形");
}
}

不同的颜色对应的实现类:

public class Red implements Color {
@Override
public void coloring() {
System.out.print("红色-》");
}
}
public class Yellow implements Color {
@Override
public void coloring() {
System.out.print("黄色-》");
}
}
public class Blue implements Color {
@Override
public void coloring() {
System.out.print("蓝色-》");
}
}

测试类:

public class Test {

    public static void main(String[] args) {
//画一个红色的圆
Shape redCircle = new Circle(new Red());
redCircle.draw();
System.out.println(); //画一个黄色的矩形
Shape yellowRect = new Rect(new Yellow());
yellowRect.draw();
System.out.println(); //画一个蓝色的三角形
Shape blueTriangle = new Triangle(new Blue());
blueTriangle.draw();
}
}



类图:

桥接模式

定义

将多个维度的变化以抽象的方式组合在一起。使用者面向抽象。各维度间解耦,可自由变化

意图

将抽象部分与实现部分分离,使它们都可以独立的变化

主要解决问题

在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵

何时使用

实现系统可能有多个角度分类,每一种角度都可能变

优缺点

优点:

  1. 抽象和实现的分离
  2. 优秀的扩展能力
  3. 实现细节对客户透明

缺点:

桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程

类图:



涉及的角色:

  1. 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用
  2. 修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义
  3. 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现
  4. 具体实现化(ConcreteImplementor)角色:这个角色给出实现化角色接口的具体实现

对应的源码如下:

public abstract class Abstraction {

    protected Implementor implementor;

    public void operation(){
implementor.operationImpl();
}
}
public class RefinedAbstraction extends Abstraction {

    @Override
public void operation() {
super.operation();
}
}
public abstract class Implementor {

    public abstract void operationImpl();
}
public class ConcreteImplementor extends Implementor {
@Override
public void operationImpl() {
//do something......
}
}

八戒转世投胎的故事

《西游记》中天蓬元帅转世成为猪八戒的故事,大家耳熟能详,现在从桥接模式的观点出发,来看一下这个故事:

如果存在灵魂的话,应当是抽象化角色,而肉体则是实现化角色,肉体为灵魂的功能提供了实现



抽象化角色:灵魂

public interface Soul {

    /** 灵魂 */
void mySoul();
}

修正抽象化角色:

public class SoulRefined1 implements Soul {

    private Body body;

    public SoulRefined1(Body body) {
this.body = body;
} @Override
public void mySoul() {
System.out.println("天蓬元帅");
this.body.myBody();
}
}
public class SoulRefined2 implements Soul {

    private Body body;

    public SoulRefined2(Body body) {
this.body = body;
} @Override
public void mySoul() {
System.out.println("飞禽走兽");
this.body.myBody();
}
}

实现化角色:肉体

public interface Body {

    /** 肉体 */
void myBody();
}

具体实现化角色:

public class ConcreteBody1 implements Body {

    @Override
public void myBody() {
System.out.println("转世成人");
}
}
public class ConcreteBody2 implements Body {
@Override
public void myBody() {
System.out.println("转世成猪");
}
}

测试类:

public class Test {

    public static void main(String[] args) {
Body body = new ConcreteBody2();
Soul soul = new SoulRefined1(body);
soul.mySoul();
}
}



类图:

八戒转世投胎竟然是Java设计模式:桥接模式的更多相关文章

  1. 【设计模式】Java设计模式 - 桥接模式

    [设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...

  2. JAVA 设计模式 桥接模式

    用途 桥接模式 (Bridge) 将抽象部分与实现部分分离,使它们都可以独立的变化. 桥接模式是一种结构式模式. 结构

  3. Java设计模式-桥接模式(Bridge)

    桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化.桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时 ...

  4. java设计模式---桥接模式

    桥接模式的目的是把抽象和具体实现分离,其uml类图如下所示: public interface SendMessage { abstract void send(String message,Stri ...

  5. java设计模式——桥接模式

    一. 定义与类型 定义:将抽象部分与他的具体实现部分分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,而不是继承 类型:结构性. 二. 使用场景 (1) 抽象和具体实现之间增加更多的灵 ...

  6. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  7. java设计模式--单列模式

    java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...

  8. 3.java设计模式-建造者模式

    Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...

  9. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

随机推荐

  1. JVM基础入门

    内存模型 我理解的jvm: 个人理解的jvm流程: .java反编译为.class文件 经类加载器到上图的内存模型 方法区:存静态 常量区(String在里面) 本地栈区:调本地服务其它库的方法 计数 ...

  2. JUC学习

    JUC是java.util.concurrent包 并发编程的工具包 并发.并行 并发:多线程操作一个资源 并行:多人一起走 并发编程的本质:充分利用cpu的资源 线程的几个状态 新建 运行 堵塞 等 ...

  3. 微信小程序:app.json中通过使用扩展库userExtendedLib的方式,引入并使用weui

    微信小程序  PK  APP: 1.微信有海量⽤⼾,⽽且粘性很⾼,在微信⾥开发产品更容易触达⽤⼾:而推⼴app的成本太⾼. 2.微信小程序也可以跨平台(Android和IOS). 一.project. ...

  4. Js和JQuery基础

    1.JavaScript的组成 CMAScript (核心):规定了JS的语法和基本对象 DOM 文档对象模型:处理网页内容的方法和接口 BOM 浏览器对象模型:与浏览器交互的方法和接口 2.Java ...

  5. 使用gitlab构建基于docker的持续集成(三)

    使用gitlab构建基于docker的持续集成(三) gitlab docker aspnetcore 持续集成 构建发布思路: aspnetcore 下的dockerfile编写 发布docker- ...

  6. Flink的日志配置

    ------------恢复内容开始------------ 介绍flink在本地运行和on yarn运行时的日志配置. 很多现代框架都是用门面模式进行日志输出,例如使用Slf4j中的接口输出日志,具 ...

  7. python中函数与方法的区别

    在python中,其实函数和方法的区别取决于其调用者,在普通的函数定义中就叫做函数 例如: def func(): print('这是一个函数') 而在一个类中定义时,就将其分为两种情况 第一种:被称 ...

  8. java 递归求二叉树深度

    给定二叉树,找到它的最大深度. 最大深度是从根节点到最远叶节点的最长路径上的节点数. 注意:叶子是没有子节点的节点. Example: Given binary tree [3,9,20,null,n ...

  9. Win 10 下Pipenv源码安装 odoo12

    因为,本身电脑已经安装odoo8,9,10等odoo的版本,当时,没有考虑是直接是统一的环境很配置. 现在,在odoo11的环境下,需要Python 3的语言环境可以很好地支持odoo11的功能,所以 ...

  10. css字体的属性

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...