八戒转世投胎竟然是Java设计模式:桥接模式
示例
请开发一个画图程序,可以画各种颜色不同形状的图形,请用面向对象的思
想设计图形
分析:
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();
}
}

类图:

桥接模式
定义
将多个维度的变化以抽象的方式组合在一起。使用者面向抽象。各维度间解耦,可自由变化
意图
将抽象部分与实现部分分离,使它们都可以独立的变化
主要解决问题
在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵
何时使用
实现系统可能有多个角度分类,每一种角度都可能变
优缺点
优点:
- 抽象和实现的分离
- 优秀的扩展能力
- 实现细节对客户透明
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
类图:

涉及的角色:
- 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用
- 修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义
- 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现
- 具体实现化(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设计模式:桥接模式的更多相关文章
- 【设计模式】Java设计模式 - 桥接模式
[设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...
- JAVA 设计模式 桥接模式
用途 桥接模式 (Bridge) 将抽象部分与实现部分分离,使它们都可以独立的变化. 桥接模式是一种结构式模式. 结构
- Java设计模式-桥接模式(Bridge)
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化.桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时 ...
- java设计模式---桥接模式
桥接模式的目的是把抽象和具体实现分离,其uml类图如下所示: public interface SendMessage { abstract void send(String message,Stri ...
- java设计模式——桥接模式
一. 定义与类型 定义:将抽象部分与他的具体实现部分分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,而不是继承 类型:结构性. 二. 使用场景 (1) 抽象和具体实现之间增加更多的灵 ...
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- java设计模式--单列模式
java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...
- 3.java设计模式-建造者模式
Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
随机推荐
- 敏捷史话(七):从程序员、作家到摇滚乐手——Andy Hunt的多面人生
与其说 Andy Hunt 是敏捷宣言的创始人,不如说他是一名专业作家来得更为合适.他的<实用程序员><程序员修炼之道:从小工到专家><编程 Ruby:实用程序员指南&g ...
- TERSUS无代码开发(笔记07)-简单实例手机端后台逻辑开发
提交申请逻辑开发 1.添加父级对象引用(从父级对象中获取前端输入框的值) 1.设计数据库表(表名和字段名称不能用中文) 2.设计置数据库主键(可设联合主键) 3.传值形成数据实列处理 4.服务器端处理 ...
- 翻译:《实用的Python编程》02_05_Collections
目录 | 上一节 (2.4 序列) | 下一节 (2.6 列表推导式) 2.5 collections 模块 collections 模块为数据处理提供了许多有用的对象.本部分简要介绍其中的一些特性. ...
- 第47天打卡学习(单例模式 深入了解CAS 原子引用 各种锁的理解)
18彻底玩转 单例模式 饿汉式 DCL懒汉模式 探究! 饿汉式 package com.kuang.single; //饿汉式单例 //单例模式重要思想是构造器私有 public class Hun ...
- alpine jdk 中文乱码
一.概述 使用alpine镜像构建了一个oracle jdk的镜像,运行java业务时,查看日志,显示中文乱码. 但是,基于Alpine Linux的Docker基础镜像的镜像文件很小,也有代价: 把 ...
- std和stl的关系
[前言]在写程序时,虽然一直这么用,有点疑惑为甚么引入了头文件.h还要在加上using namespace std?例如: 1 #include<iostream> 2 using nam ...
- Python切换版本工具pyenv
目录 安装pyenv 安装与查看py版本 切换py版本 结合ide使用示例 和virtualenv的一些区别 参考文献 使用了一段时间,我发现这玩意根本不是什么神器,简直就是垃圾,安装多版本总是失败, ...
- cve-2019-2725 反序列化远程代码执行
描述:部分版本WebLogic中默认包含的wls9_async_response包,为WebLogic Server提供异步通讯服务.由于该WAR包在反序列化处理输入信息时存在缺陷,攻击者可以发送精心 ...
- rest framework Response
回应 不同于基本的HttpResponse对象,TemplateResponse对象保留先前由视图提供给计算响应上下文的细节.该响应的最终输出,不计算直到需要它,以后在响应过程. - Django文档 ...
- Python编程中可能经常用到的函数
1.os.walk() 一般用法为 import os ph=r'D:\temp\build' for root,dirs,files in os.walk(ph): print(root,dirs, ...