Java描述设计模式(08):桥接模式
本文源码:GitHub·点这里 || GitEE·点这里
一、桥接模式简介
1、基础描述
桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。
2、场景问题描述
1)、场景分析
在一个复杂的系统中,消息通知是一个必备模块,一般封装方式主要从下面两个方式入手:
- 消息类型
用户端消息(user-client) 管理端消息(system-client)
- 消息接收
邮件发送(email) 短信发送(msg)
2)、场景图解
3)、源码实现
/** * 桥接模式场景应用 */ public class C01_InScene { public static void main(String[] args) { // 创建具体的实现对象 MsgImplementor implementor = new SendBySMS() ; // 创建普通的消息对象 AbstractMsg abstractMessage = new UserMsg(implementor); abstractMessage.sendMessage("您的账户异地登陆", "用户A0001"); // 切换为邮件方式且加急处理 implementor = new SendByEmail() ; abstractMessage = new AdminMsg(implementor); abstractMessage.sendMessage("项目上线通知", "运维S0001"); } } /** * 封装消息类型 */ abstract class AbstractMsg { // 持有一个实现部分的对象 MsgImplementor impl ; public AbstractMsg (MsgImplementor impl){ this.impl = impl ; } /** * 发送消息,委派给实现部分的方法 * @param message 要发送消息的内容 * @param toUser 消息的接受者 */ public void sendMessage (String message, String toUser){ this.impl.send(message, toUser); } } class AdminMsg extends AbstractMsg{ public AdminMsg(MsgImplementor impl) { super(impl); } @Override public void sendMessage(String message, String toUser) { message = "辛苦的管理员:"+message; super.sendMessage(message, toUser); } } class UserMsg extends AbstractMsg{ public UserMsg(MsgImplementor impl) { super(impl); } @Override public void sendMessage(String message, String toUser) { message = "尊敬的用户:" + message ; super.sendMessage(message, toUser); } } /** * 封装消息发送 */ interface MsgImplementor { void send (String message , String toUser) ; } class SendBySMS implements MsgImplementor{ @Override public void send(String message, String toUser) { System.out.println("短信通知:"+toUser+";内容:"+message); } } class SendByEmail implements MsgImplementor{ @Override public void send(String message, String toUser) { System.out.println("邮件通知:"+toUser+";内容:"+message); } }
二、桥接模式
1、模式图解
2、核心角色
- 抽象化(Abstraction)角色
抽象化给出的定义,并保存一个对实现化对象的引用。
- 修正抽象化(RefinedAbstraction)角色
扩展抽象化角色,改变修正父类对抽象化的定义。
- 实现化(Implementor)角色
这个角色给出实现化角色的接口,但不给出具体的实现。
- 具体实现化(ConcreteImplementor)角色
这个角色给出实现化角色接口的具体实现。
3、源码封装
abstract class Abstraction { private Implementor implementor ; public Abstraction (Implementor implementor){ this.implementor = implementor ; } // 实例方法 public void operation (){ implementor.operationImpl(); } } class RefinedAbstraction extends Abstraction{ public RefinedAbstraction(Implementor implementor) { super(implementor); } //其他的操作方法 public void otherOperation(){ } } abstract class Implementor { // 示例方法,实现抽象部分需要的某些具体功能 public abstract void operationImpl () ; } class ConcreteImplementorA extends Implementor{ @Override public void operationImpl() { System.out.println("ConcreteImplementorA.operationImpl()"); } } class ConcreteImplementorB extends Implementor{ @Override public void operationImpl() { System.out.println("ConcreteImplementorB.operationImpl()"); } }
三、Java应用场景
桥梁模式在Java应用中的一个非常典型的例子就是JDBC驱动器。抽象API可以对各种数据库引擎发出SQL指令,并不直接与数据库引擎互动,JDBC驱动器负责这个底层的工作。
JDBC的这种架构,把抽象部分和具体部分分离开来,从而使得抽象部分和具体部分都可以独立地扩展。
四、源代码地址
GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Mybatis执行SQL的4大基础组件详解
温馨提示:本篇是源码分析Mybatis ShardingJdbc SQL语句执行的前置篇。源码分析Mybatis系列目录: 1、源码分析Mybatis MapperProxy初始化之Mapper对象的扫描与构建2、源码分析Mybatis MappedStatement的创建流程 1、Executor sql执行器,其对应的类全路径:org.apache.ibatis.executor.Executor。 1.1 Executor类图 Executor执行器根据接口,定义update(更新或插入)、query(查询)、commit(提交事务)、rollback(回滚事务)。接下来简单介绍几个重要方法: int update(MappedStatement ms, Object parameter) throws SQLException更新或插入方法,其参数含义如下:、 1)MappedStatement ms:SQL映射语句(Mapper.xml文件每一个方法对应一个MappedStatement对象)2)Object parameter:参数,通常是List集合。 - < E&...
- 下一篇
Java描述设计模式(09):装饰模式
本文源码:GitHub·点这里 || GitEE·点这里 一、生活场景 1、场景描述 孙悟空有七十二般变化,他的每一种变化都给他带来一种附加的本领。他变成鱼儿时,就可以到水里游泳;他变成鸟儿时,就可以在天上飞行。 2、场景图解 3、代码实现 public class C01_InScene { public static void main(String[] args) { TheGreatestSage greatestSage = new Monkey(); TheGreatestSage fish = new Fish(greatestSage); fish.shapeDesc(); // 这里虽然是鱼形态,但是本体是悟空,所以可以直接变化 TheGreatestSage bird = new Bird(fish); bird.shapeDesc(); } } // 顶级接口 interface TheGreatestSage { // 定义一个描述形态的方法 void shapeDesc (); } // 悟空本尊 class Monkey implements TheGrea...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境