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公众号。