抽象和实现分离,灵活易扩展的桥接模式

开发 架构
桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式分离了抽象部分和实现部分,从而极大地提供了系统的灵活性。桥梁模式使得抽象部分和实现部分可以分别独立地扩展,而不会相互影响,从而大大提高了系统的可扩展性。

01 定义

桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。

02 案例

需求

通过企业微信和qq的方式给员工发送消息

方案一

定义发送消息的接口

/**
* 发送消息的接口
* @author:liyajie
* @createTime:2022/2/21 10:33
* @version:1.0
*/
public interface AbstractSendMsgService {
// 发送消息
public void sendMsg();
}

定义普通消息接口

/**
* 普通消息接口
* @author:liyajie
* @createTime:2022/2/21 11:32
* @version:1.0
*/
public interface CommonMsg extends AbstractSendMsgService{

}

定义微信消息实现类

/**
* 发送消息的实现接口
* @author:liyajie
* @createTime:2022/2/21 10:35
* @version:1.0
*/
public class WxMsgServiceImpl implements CommonMsg{
@Override
public void sendMsg() {
System.out.println("老板使用微信给你发了消息,快去接收吧");
}
}

定义QQ消息实现类

/**
* 发送消息的实现接口
* @author:liyajie
* @createTime:2022/2/21 10:35
* @version:1.0
*/
public class QqMsgServiceImpl implements CommonMsg{
@Override
public void sendMsg() {
System.out.println("老板使用QQ给你发了消息,快去接收吧");
}
}

定义测试类

/**
* 测试类
* @author:liyajie
* @createTime:2022/2/21 10:37
* @version:1.0
*/
public class Test {
public static void main(String[] args) {
new WxMsgServiceImpl().sendMsg();
new QqMsgServiceImpl().sendMsg();
}
}

测试结果

方案二

定义发送消息抽象接口

/**
* 发送消息的抽象接口
* @author:liyajie
* @createTime:2022/2/21 10:33
* @version:1.0
*/
public abstract class NewAbstractSendMsgService {

protected SendMsgImplementor sendMsgImplementor;

public NewAbstractSendMsgService(SendMsgImplementor sendMsgImplementor){
this.sendMsgImplementor = sendMsgImplementor;
}

// 微信
public void sendMsg(){
this.sendMsgImplementor.sendMsg();
}
}

定义发送消息实现类

/**
* 发送消息的实现接口
* @author:liyajie
* @createTime:2022/2/21 10:35
* @version:1.0
*/
public class NewSendMsgServiceImpl extends NewAbstractSendMsgService{

public NewSendMsgServiceImpl(SendMsgImplementor sendMsgImplementor) {
super(sendMsgImplementor);
}

@Override
public void sendMsg() {
super.sendMsg();
}
}

定义发送消息统一接口

/**
* 发送消息统一接口
* @author:liyajie
* @createTime:2022/2/21 10:41
* @version:1.0
*/
public interface SendMsgImplementor {

void sendMsg();
}

定义微信发送消息实现类

/**
* 微信发送消息
* @author:liyajie
* @createTime:2022/2/21 10:45
* @version:1.0
*/
public class WxImplementor implements SendMsgImplementor{
@Override
public void sendMsg() {
System.out.println("老板使用微信给你发了消息,快去接收吧");
}
}

定义QQ发送消息实现类

/**
* QQ发送消息
* @author:liyajie
* @createTime:2022/2/21 10:45
* @version:1.0
*/
public class QqImplementor implements SendMsgImplementor{
@Override
public void sendMsg() {
System.out.println("老板使用QQ给你发了消息,快去接收吧");
}
}

定义测试类

/**
* 测试类
* @author:liyajie
* @createTime:2022/2/21 10:37
* @version:1.0
*/
public class TestNew {
public static void main(String[] args) {
NewSendMsgServiceImpl newSendMsgService = new NewSendMsgServiceImpl(new QqImplementor());
newSendMsgService.sendMsg();

NewSendMsgServiceImpl newSendMsgService2 = new NewSendMsgServiceImpl(new WxImplementor());
newSendMsgService2.sendMsg();
}
}

测试结果

03 对比分析

  • 方案一,即一般实现方式,微信和QQ两种发送消息的方式需要同时去实现CommonMsg和AbstractSendMsgService两个接口中的方法,耦合性较高;另外比如新增紧急消息的发送或者新增短信的方式发送消息的需求,改动较多,扩展性较差。
  • 方案二,为桥接模式实现方式,在消息类的构造方法中传入接口SendMsgImplementor,从而使发送消息的抽象和具体实现进行了分离,实现了解耦;后期新增紧急消息的发送或者新增短信的方式发送消息的需求,也只需要新增紧急消息类和短信发送类即可,和QQ,微信等发送消息互不影响,扩展方便,符合开闭原则,复用原则。

04 总结

桥梁模式分离了抽象部分和实现部分,从而极大地提供了系统的灵活性。让抽象部分和实现部分独立出来,分别定义接口,这有助于对系统进行分层,从而产生更好的结构化的系统。

桥梁模式使得抽象部分和实现部分可以分别独立地扩展,而不会相互影响,从而大大提高了系统的可扩展性。

本文转载自微信公众号「温故知新之java」,可以通过以下二维码关注。转载本文请联系温故知新之java公众号。

责任编辑:武晓燕 来源: 温故知新之java
相关推荐

2024-04-12 12:10:18

Python设计模式开发

2022-01-14 09:22:22

设计模式桥接

2020-10-28 11:56:47

桥接模式

2021-03-05 07:57:41

设计模式桥接

2022-05-11 08:17:15

Java字符串API

2011-06-01 16:10:42

JNBridge

2015-11-12 09:32:03

Javascript设计模式

2010-03-19 11:07:57

点对点无线桥接模式

2010-02-06 15:17:41

Ubuntu Serv

2011-11-10 16:43:59

WDS无线桥接

2022-06-20 14:59:14

读写分离模Loki

2021-10-22 09:41:26

桥接模式设计

2020-05-08 17:05:11

VMware网络NAT

2010-04-09 16:15:02

无线桥接设置

2010-04-08 17:02:14

无线桥接方案

2024-03-06 13:19:19

工厂模式Python函数

2012-02-29 13:42:32

小型蜂窝无线网络蜂窝网络

2009-05-13 09:39:00

双网卡共享带宽

2009-08-18 11:12:34

Ubuntu下Virt桥接网络配置

2010-04-16 09:36:45

JDBC桥接Oracl
点赞
收藏

51CTO技术栈公众号