桥接模式

  • 示例
    • 代码实例
  • 桥接模式
    • 定义
    • 意图
    • 主要解决问题
    • 何时使用
    • 优缺点
  • 八戒转世投胎的故事

示例

请开发一个画图程序,可以画各种颜色不同形状的图形,请用面向对象的思
想设计图形
分析:
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);}@Overridepublic void draw() {this.color.coloring();System.out.print("圆");}
}
public class Rect extends Shape {public Rect(Color color) {super(color);}@Overridepublic void draw() {this.color.coloring();System.out.print("矩形");}
}
public class Triangle extends Shape {public Triangle(Color color) {super(color);}@Overridepublic void draw() {this.color.coloring();System.out.print("三角形");}
}

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

public class Red implements Color {@Overridepublic void coloring() {System.out.print("红色-》");}
}
public class Yellow implements Color {@Overridepublic void coloring() {System.out.print("黄色-》");}
}
public class Blue implements Color {@Overridepublic 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 {@Overridepublic void operation() {super.operation();}
}
public abstract class Implementor {public abstract void operationImpl();
}
public class ConcreteImplementor extends Implementor {@Overridepublic void operationImpl() {//do something......}
}

八戒转世投胎的故事

《西游记》中天蓬元帅转世成为猪八戒的故事,大家耳熟能详,现在从桥接模式的观点出发,来看一下这个故事:
如果存在灵魂的话,应当是抽象化角色,而肉体则是实现化角色,肉体为灵魂的功能提供了实现

抽象化角色:灵魂

public interface Soul {/** 灵魂 */void mySoul();
}

修正抽象化角色:

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

实现化角色:肉体

public interface Body {/** 肉体 */void myBody();
}

具体实现化角色:

public class ConcreteBody1 implements Body {@Overridepublic void myBody() {System.out.println("转世成人");}
}
public class ConcreteBody2 implements Body {@Overridepublic 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设计模式-装饰器模式后的桥接模式出来了,感兴趣的话,就来看一看吧. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢 ...

  2. java设计模式桥接模式最详细讲解,从设计卷到开发看源码

    为什么要使用设计模式? 说到底还是为了程序拓展和移植性,无法就是那几种设计思想 单一职责原则 , 开闭原则  里氏替换原则 ,依赖倒置原则,接口隔离原则,组合复用原则  迪米特法则这些思想和原则就是为 ...

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

    一.概述 桥接模式主要是将抽象和实现解耦,使得两者都可以独立变化 在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分.如何设计类似于 Photoshop 这样的软件,能画不 ...

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

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

  5. Java设计模式 - 桥接模式

    目录 桥接模式: 桥接优点: 桥接模式应用: 桥接模式和策略模式的区别 桥接实例: 类图: 示例: 代码: 上述代码 GitHub 地址:https://github.com/baicun/desig ...

  6. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  7. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

  8. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  9. Java设计模式-工厂模式(2)工厂方法模式

    在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...

最新文章

  1. Codeforces 846 A Curriculum Vitae 思维 暴力
  2. haoop格式化做的工作
  3. 描述linux目录结构以及目录结构命名规定
  4. C++实现另一个猜数字游戏
  5. RabbitMQ脑裂
  6. redis持久化策略梳理及主从环境下的策略调整记录
  7. oracle instant client配置(MAC OS)
  8. mysql强制禁止使用索引_MYSQL强制使用索引和禁止使用索引
  9. 多表操作查询 一对一
  10. java语言编译_java在线编译-编译,java
  11. cv方向有哪些_【星球知识卡片】视频分类与行为识别有哪些核心技术,对其进行长期深入学习...
  12. 如何找到chromedriver与chrome的对应版本
  13. php获取客户端ip端口,Phpwind获取用户真实IP
  14. tensorflow下基于DNN实现实时分辨人脸微表情
  15. 用C语言编程写高考祝福,2020高考祝福自己的句子_高考给自己加油打气的话精选100句...
  16. js 复制微信号码 并唤醒微信
  17. LDA模型,获取所有的文档-主题分布(即得到文档对于每个主题的概率分布)并保存
  18. 怎么做成html网页,html网页制作的基本步骤?怎么用html做一个网页?
  19. ISMS整体项目进度表
  20. win10系统还原被组策略关闭怎么解决

热门文章

  1. 美国的穷人穷到什么程度?
  2. Echarts柱状图的宽度设置
  3. 电脑护眼小软件f.lux
  4. [转帖] Kubernetes如何使用ReplicationController、Replica Set、Deployment管理Pod ----文章很好 但是还没具体操作实践 也还没记住....
  5. 1号店D50手机价格策略,让电商重回透明服务
  6. ESP32链接网络后无法与电脑通信
  7. 解决Win10 Windows10关键错误 开始菜单和Cortana无法工作问题
  8. mysql sql 子查询 执行顺序_MySQL,SQL语句执行顺序
  9. 小米5点android版本,小米5的手机系统是什么?小米5能升级安卓5.0吗?
  10. 如何借助扬尘视频监测系统开展扬尘污染防控工作?