(尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/52490611冷血之心的博客)

目录

桥梁模式(桥接模式)

定义:

通用类图如下:

角色介绍:

● Abstraction——抽象化角色

● Implementor——实现化角色

● Refined Abstraction——修正抽象化角色

● Concrete Implementor——具体实现化角色

通用源代码:

测试类:

桥梁模式的优点:

● 抽象和实现分离

● 优秀的扩充能力

● 实现细节对客户透明

使用场景:

● 不希望或不适用使用继承的场景

● 接口或抽象类不稳定的场景

● 重用性要求较高的场景

总结:


桥梁模式(桥接模式)

定义:

将抽象和实现解耦,使得两者可以独立地变化。

桥梁模式是为了解决类继承的缺点而设计的。一个类想拥有另一个类的方法,可以不继承,只需要铺设一个桥梁(引用)架过去就OK了。

通用类图如下:

角色介绍:

● Abstraction——抽象化角色

它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。

● Implementor——实现化角色

它是接口或者抽象类,定义角色必需的行为和属性。

● Refined Abstraction——修正抽象化角色

它引用实现化角色对抽象化角色进行修正。

● Concrete Implementor——具体实现化角色

它实现接口或抽象类定义的方法和属性。

通用源代码:

//实现化角色
public interface Implementor {//基本方法public void doSomething();public void doAnything();
}

它没有任何特殊的地方,就是一个一般的接口,定义要实现的方法。

//具体实现化角色
public class ConcreteImplementor1 implements Implementor{public void doSomething(){//业务逻辑处理}public void doAnything(){//业务逻辑处理}
}
public class ConcreteImplementor2 implements Implementor{public void do Something(){//业务逻辑处理
}public void do Anything(){//业务逻辑处理}
}

上面定义了两个具体实现化角色代表两个不同的业务逻辑。

抽象化角色
public abstract class Abstraction {//定义对实现化角色的引用private Implementor imp;//约束子类必须实现该构造函数public Abstraction(Implementor _imp){this.imp = _imp;}//自身的行为和属性public void request(){this.imp.doSomething();}//获得实现化角色public Implementor getImp(){return imp;}
}

为什么要增加一个构造函数?答案是为了提醒子类,你必须做这项工作,指定实现者,特别是已经明确了实现者,则尽量清晰明确地定义出来。

具体抽象化角色
public class RefinedAbstraction extends Abstraction {//覆写构造函数public RefinedAbstraction(Implementor _imp){super(_imp);}//修正父类的行为@Overridepublic void request(){/** 业务处理...*/super.request();super.getImp().doAnything();}
}

测试类:

public class Client {public static void main(String[] args) {//定义一个实现化角色Implementor imp = new ConcreteImplementor1();//定义一个抽象化角色Abstraction abs = new RefinedAbstraction(imp);//执行行文abs.request();}
}

桥梁模式是一个非常简单的模式,它只是使用了类间的聚合关系、继承、覆写等常用功能,但是它却提供了一个非常清晰、稳定的架构。

各位请仔细瞅瞅桥梁模式,就是ConcreteImplementor1类有两个方法:dosomething( )和doanything( )。然后有一个类RefinedAbstraction就也想拥有这两方法,但是又不想实现继承关系,所以利用了一个桥梁(引用)就OK了。

桥梁模式的优点:

● 抽象和实现分离

这也是桥梁模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式。在该模式下,实现可以不受抽象的约束,不用再绑定在一个固定的抽象层次上。

● 优秀的扩充能力

看看我们的例子,想增加实现?没问题!想增加抽象,也没有问题!只要对外暴露的接口层允许这样的变化,我们已经把变化的可能性减到最小。

● 实现细节对客户透明

客户不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装。

使用场景:

● 不希望或不适用使用继承的场景

例如继承层次过渡、无法更细化设计颗粒等场景,需要考虑使用桥梁模式。

● 接口或抽象类不稳定的场景

明知道接口不稳定还想通过实现或继承来实现业务需求,那是得不偿失的,也是比较失败的做法。

● 重用性要求较高的场景

设计的颗粒度越细,则被重用的可能性就越大,而采用继承则受父类的限制,不可能出现太细的颗粒度。

总结:

        继承非常好,但是有缺点(比如"强侵入"),我们可以扬长避短,对于比较明确不发生变化的,则通过继承来完成;若不能确定是否会发生变化的,那就认为是会发生变化,则通过桥梁模式来解决,这才是一个完美的世界。

如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,我会持续更新,如果有什么问题,可以进群366533258一起交流学习哦~

Java设计模式—桥梁模式相关推荐

  1. java设计模式-桥梁模式

    桥梁模式 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是"将抽象化(Abstraction)与实现化(Imple ...

  2. java设计模式工厂模式_Java中的桥梁设计模式

    java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...

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

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

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

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

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

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

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

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

  7. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

  8. java设计模式代理模式_Java中的代理设计模式

    java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...

  9. java设计模式 订阅模式_Java中的外观设计模式

    java设计模式 订阅模式 立面是指建筑物的外观. 当穿过街道时,我们所看到的只是建筑物的外观. 该工作面抽象了建筑物的所有复杂实现细节. 同样, 外观设计模式旨在为子系统中的一组接口提供统一的接口. ...

最新文章

  1. jQuery带动画的弹出对话框
  2. vs2012调试中出现char类型形参与LPCTSTR类型不匹配
  3. 4.7 程序示例--算法诊断-机器学习笔记-斯坦福吴恩达教授
  4. Mysql Errcode: 24 - Too many open files
  5. MYSQL用存储过程创建百万级测试数据表
  6. 了解Stack Overflow,这是您获得编程和调试知识的途径
  7. python 基础学习--运算符集合
  8. DXUT框架剖析(3)
  9. Matplotlib从入门到精通
  10. linux下hex文件到bin文件的格式转化,hex转换成bin文件小工具(HEX2BIN.EXE)下载_hex转换成bin文件小工具(HEX2BIN.EXE)官方下载-太平洋下载中心...
  11. ADB登录验证暴力破解工具
  12. Android控件:在《第一行代码(第二版)》学习RecyclerView的踩坑经过
  13. 读书笔记_打开量化投资的黑箱02
  14. 如何成为一名优秀的技术工程师?
  15. 【牛客刷题-SQL进阶挑战】NO5.窗口函数
  16. 自学编程难吗?如何学?
  17. stm32 esp8266-01使用 get,post 请求数据以及json解析
  18. 【模型库】龙门铣床三维模型(具有x_t通用格式)
  19. PVE 定时关机 定时开机
  20. 161. 相隔为 1 的编辑距离

热门文章

  1. 是否要从单片机转为嵌入式Linux
  2. 大数据全攻略:10年老兵带你看尽MaxCompute大数据运算挑战与实践
  3. OSChina 周二乱弹 ——首届码云女神
  4. IBM Notes 9.0.1FP10版本发布新的补丁程序IF5
  5. 物流业如何借力物联网
  6. 2007年计算机专业毕业生就业状况调查(转)
  7. Android拖拽排序控件DragGridView
  8. 腾讯2014年实习生招聘广州站offer经历(TEG-后台开发)
  9. shell脚本相关命令实验总结
  10. 布林通道参数用20还是26_布林线指标参数设置为13、20、26、30、60、99,那个才是最佳?...