当前位置: 首页 > wzjs >正文

长春网站快速优化排名中国最厉害的网站建设公司

长春网站快速优化排名,中国最厉害的网站建设公司,网站建设合同的内容与结构,网站没收录的几大原因手撕设计模式之消息推送系统——桥接模式 1.业务需求 ​ 大家好,我是菠菜啊,好久不见,今天给大家带来的是——桥接模式。老规矩,在介绍这期内容前,我们先来看看这样的需求:我们现在要做一个消息推送系统&…

手撕设计模式之消息推送系统——桥接模式

1.业务需求

​ 大家好,我是菠菜啊,好久不见,今天给大家带来的是——桥接模式。老规矩,在介绍这期内容前,我们先来看看这样的需求:我们现在要做一个消息推送系统,实现纯文本消息和html格式消息的推送,推送方式支持email、短信,我们该怎么实现?

请添加图片描述

2.代码实现

Talk is cheap,show me your code.

初版实现思路:

​ 假设我们有一个父类Message类(消息类型),从它扩展出俩个子类:TextMessage、HtmlMessage,又要支持email、短信推送方式,那么我们需要共创建4个子类才能覆盖所有组合。

请添加图片描述

初版代码如下:

//消息基类
public abstract class Message {abstract   void sendMessage(String message);
}
//文本消息类
public class TextMessage extends  Message{@Overridevoid sendMessage(String message) {System.out.println("TextMessage:"+message);}
}
//html消息类
public class HtmlMessage extends  Message{@Overridevoid sendMessage(String message) {System.out.println("HtmlMessage:"+message);}
}
public class HtmlEmailMessage extends HtmlMessage{@Overridevoid sendMessage(String message) {super.sendMessage(message);System.out.println("send HtmlMessage by eamil");}
}
public class HtmlSmsMessage extends HtmlMessage{@Overridevoid sendMessage(String message) {super.sendMessage(message);System.out.println("send HtmlMessage by sms");}
}
public class TextEmailMessage extends TextMessage{@Overridevoid sendMessage(String message) {super.sendMessage(message);System.out.println("send TextMessage by eamil");}
}
public class TextSmsMessage extends TextMessage{@Overridevoid sendMessage(String message) {super.sendMessage(message);System.out.println("send TextMessage by sms");}
}
public class Client {public static void main(String[] args) {Message message = new TextSmsMessage();message.sendMessage("hello world");Message message2 = new HtmlEmailMessage();message2.sendMessage("<html> <h>hello world </h></html>");}
}

输出结果:

在这里插入图片描述

思考:

​ 上述每添加一种消息类型或者消息推送方式,都要新增一个维度的子类,导致类爆炸。而且我们发现消息类型和消息推送方式是俩种独立维度,我们不应该用继承的这种方式去拓展,那么该怎么解决呢?

3.代码优化

//发送方式
public interface MessageSender {void send(String message);
}
//短信发送方式
public class SmsMessageSender implements MessageSender {@Overridepublic void send(String message) {System.out.println("使用sms发送消息:" + message);}
}
//eamil发送方式
public class EmailMessageSender implements MessageSender {@Overridepublic void send(String message) {System.out.println("使用email发送消息:" + message);}
}
//消息类
public abstract class Message2 {protected MessageSender messageSender;public Message2(MessageSender messageSender) {this.messageSender = messageSender;}abstract   void sendMessage(String message);
}
//文本消息类
public class TextMessage2 extends  Message2{public TextMessage2(MessageSender messageSender) {super(messageSender);}@Overridevoid sendMessage(String message) {System.out.println("TextMessage:"+message);messageSender.send(message);}
}
//html消息类
public class HtmlMessage2 extends  Message2{public HtmlMessage2(MessageSender messageSender) {super(messageSender);}@Overridevoid sendMessage(String message) {System.out.println("HtmlMessage:"+message);messageSender.send(message);}
}

输出结果:

在这里插入图片描述

实现代码结构图:
在这里插入图片描述

思考:

​ 上述将发送消息方式抽象出来,消息类中消息的发送方式委托给MessageSender,通过组合的方式实现消息类型(文本、HTML、模板、紧急)和发送渠道(邮件、短信、推送、微信)这两个维度的独立变化,职责清晰,扩展性强。这个设计模式完全体现了设计原则中的合成复用原则(Composite Reuse Principle)“优先使用对象组合(Composition),而不是类继承(Inheritance)来实现代码复用。”

4.定义与组成

请添加图片描述


定义:

桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们可以独立地变化。

核心思想
通过组合替代继承,将抽象(功能层次)与实现(平台层次)解耦,解决多维变化导致的类爆炸问题。

组成部分:

  • 抽象部分(Abstraction):定义高层控制逻辑的接口,并且持有实现部分的引用

  • 精确抽象(Refined Abstraction):扩展抽象功能的子类

  • 实现者接口(Implementor):定义底层实现的契约

  • 具体实现者(Concrete Implementor):具体的底层实现

5.典型应用

1)JDBC驱动程序(源码简化)

//实现者接口 - Driver
public interface Driver {Connection connect(String url, Properties info) throws SQLException;boolean acceptsURL(String url);
}
//具体实现者 - MySQLDriver
public class MySQLDriver implements Driver {@Overridepublic Connection connect(String url, Properties info) {if (!acceptsURL(url)) return null;// 实际建立物理连接Socket socket = new Socket(extractHost(url), extractPort(url));return new MySQLConnectionImpl(socket);}private String extractHost(String url) { /* 解析主机名 */ }private int extractPort(String url) { /* 解析端口号 */ }
}
//抽象接口 - Connection
public interface Connection extends AutoCloseable {Statement createStatement() throws SQLException;PreparedStatement prepareStatement(String sql) throws SQLException;// ... 其他抽象方法
}
//精确抽象 - MySQLConnectionImpl
class MySQLConnectionImpl implements Connection {private final Socket socket;private final OutputStream out;private final InputStream in;public MySQLConnectionImpl(Socket socket) {this.socket = socket;this.out = socket.getOutputStream();this.in = socket.getInputStream();}@Overridepublic Statement createStatement() {return new MySQLStatementImpl(this);}// 实际发送SQL命令到MySQL服务器void sendCommand(String command) {out.write(command.getBytes());out.flush();}// ... 其他具体实现
}
//桥接点 - DriverManager
public class DriverManager {private static final List<Driver> drivers = new CopyOnWriteArrayList<>();public static void registerDriver(Driver driver) {drivers.add(driver);}public static Connection getConnection(String url, String user, String pass) {for (Driver driver : drivers) {if (driver.acceptsURL(url)) {Properties props = new Properties();props.setProperty("user", user);props.setProperty("password", pass);return driver.connect(url, props);}}throw new SQLException("No suitable driver found");}
}

2)GUI开发(AWT/Swing)

windows类中有抽象的窗口接口,并有一个画窗口的方法,实现不同平台画窗口功能委托给具体的平台实现


// 抽象:Window
public class Window {private WindowImpl impl;  // 桥接关键public void draw() {impl.deviceDraw();  // 委托给具体平台实现}
}// 实现:不同OS的图形实现
interface WindowImpl {void deviceDraw();
}class WindowsWindowImpl implements WindowImpl {...}
class MacWindowImpl implements WindowImpl {...}

6.适用场景

场景特征示例
存在多个独立变化维度图形形状 × 渲染方式
需要运行时切换实现动态切换支付渠道
避免永久绑定抽象与实现JDBC连接不同数据库
类层次结构爆炸避免创建 N×M 子类组合

经验法则:当听到"需要根据不同平台/方式做不同实现"时,优先考虑桥接模式

技术需要沉淀,同样生活也是~
个人链接:博客,欢迎一起交流


文章转载自:

http://Vkp2vyge.dwwLg.cn
http://HjijUIop.dwwLg.cn
http://WhHal96x.dwwLg.cn
http://TYrJoa4M.dwwLg.cn
http://9g33tVcI.dwwLg.cn
http://01IdMB85.dwwLg.cn
http://rK7Rkxh8.dwwLg.cn
http://JbWy5Jp7.dwwLg.cn
http://ocS5tiYC.dwwLg.cn
http://yOaIVSkh.dwwLg.cn
http://AlO8lKfk.dwwLg.cn
http://egAnaajW.dwwLg.cn
http://Ebm31eHn.dwwLg.cn
http://iSHBrcok.dwwLg.cn
http://z3qLaik9.dwwLg.cn
http://08Kgoc4l.dwwLg.cn
http://DyM3JsBA.dwwLg.cn
http://SDAumPmW.dwwLg.cn
http://d8gfVq3H.dwwLg.cn
http://wVrUQJTy.dwwLg.cn
http://he0jhtKm.dwwLg.cn
http://AplW2Q2T.dwwLg.cn
http://1r8WtdKC.dwwLg.cn
http://TfEoC6PQ.dwwLg.cn
http://FdltIKog.dwwLg.cn
http://TNLQsIR5.dwwLg.cn
http://PwS2Po7J.dwwLg.cn
http://iGfNdjo6.dwwLg.cn
http://6niULFjo.dwwLg.cn
http://imoczYDp.dwwLg.cn
http://www.dtcms.com/wzjs/636676.html

相关文章:

  • wordpress修复插件成都网站排名生客seo
  • 广东网站建设有限公司hao123手机浏览器
  • 淄博有限公司网seo排名优化教程
  • 免费建音乐网站网站建设周志200字
  • 网站建设开发程序wordpress自动转二维码
  • 手机做炫光头像图的网站陕西省建设网企业信息
  • wordpress主题站模板武清区网站建设
  • 上海php做网站年报申报入口
  • 成品短视频网站源码搭建网站域名如何更换
  • 福清哪有做网站的地方wordpress 去除category
  • 深圳网站制作公司售后asp做网站步骤
  • 海外网站cdn加速下载什么网站权重高
  • 地方o2o同城网站源码系统开发总结
  • 广州微信网站建设市场网站管理助手v3.0
  • 靖江网站定制淘宝天猫网上购物商城
  • win8风格 网站模板装饰公司门头
  • 好网站建设公司哪里好国家高新技术企业官网
  • python做网站入门网站开发交什么税
  • 网站访问量咋做2022年深圳在建工程查询
  • 英山县城乡建设规划局网站做物流网站费用多少
  • 有口碑的中山网站建设wordpress免费商城模板下载
  • 网站的push运营怎么做开发一个app价目表
  • 营销型网站建设公司是干嘛的wordpress api 发贴
  • 网站开发如何共用菜单栏企业负责人电话名录
  • 徐汇科技网站建设网站建设方案书 模板
  • 山西省住房建设厅网站房屋建筑定额西安网站建设公司有哪些
  • 南阳做网站优化wordpress 插件 前端
  • 常用的电子商务网站开发技术东营企业网站制作
  • 服装网站策划设计二手书交易网站开发背景分析
  • 网站建设模板源码特效网站域名密码忘了