本文节选自《设计模式就该这样学》例如,我们在办公室时经常通过邮件消息、短信消息或者系统中的消息与同事交流。尤其是在办理一些审批流程的时候,我们需要把这些流程记录下来备查。消息按类型分为邮件消息、短信消息和系统消息。但是,根据消息的紧急程度,消息可以分为普通消息、紧急消息和紧急消息。显然,整个消息系统可以分为两个维度,如下图所示。如果用继承,情况就复杂了,也不利于扩展。电子邮件可以是普通的也可以是紧急的;SMS消息可以是普通的也可以是紧急的。下面我们使用桥接模式来解决这个问题。首先创建一个IMessage接口作为桥梁。/***实现消息发送的统一接口*/publicinterfaceIMessage{//发送消息的内容和接收者voidsend(Stringmessage,StringtoUser);}创建一个邮件消息实现EmailMessage类。/***邮件消息的实现类*/publicclassEmailMessageimplementsIMessage{publicvoidsend(Stringmessage,StringtoUser){System.out.println("Sendusingemailmessage"+message+"to"+toUser);}}创建SMS消息以实现SmsMessage类。/***短信实现类*SMS(ShortIMessageService)短信服务*/publicclassSmsMessageimplementsIMessage{publicvoidsend(Stringmessage,StringtoUser){System.out.println("使用短信发送"+message+"give"+toUser);}}然后创建桥梁抽象角色AbstractMessage类。/***Abstractmessageclass*/publicabstractclassAbstractMessage{//持有一个实现部分的对象IMessage消息;//构造方法,传入实现部分的对象publicAbstractMessage(IMessagemessage){this.message=message;}//发送消息,委托给方法的实现部分publicvoidsendMessage(Stringmessage,StringtoUser){this.message.send(message,toUser);}}创建一个实现普通消息的NomalMessage类。/***普通消息类*/publicclassNomalMessageextendsAbstractMessage{//构造方法,传入实现部分的对象publicNomalMessage(IMessagemessage){super(message);}@OverridepublicvoidsendMessage(Stringmessage,StringtoUser){//对于普通消息,可以直接调用父类方法发送消息。super.sendMessage(消息,toUser);}}创建专门实现紧急消息的UrgencyMessage类。/***紧急消息类*/publicclassUrgencyMessageextendsAbstractMessage{//构造方法publicUrgencyMessage(IMessagemessage){super(message);}@OverridepublicvoidsendMessage(Stringmessage,StringtoUser){message="addUrgent:"+message;super.sendMessage(消息,toUser);}//扩展其功能,监听某个消息的处理状态publicObjectwatch(StringmessageId){//根据给定的消息编码(messageId)查询消息的处理状态//整理成监听处理状态,并然后返回返回空;}}最后,编写客户端测试代码。publicstaticvoidmain(String[]args){IMessagemessage=newSmsMessage();AbstractMessageabstractMessage=newNomalMessage(消息);abstractMessage.sendMessage("表示同意加班申请","王先生");message=newEmailMessage();abstractMessage=newUrgencyMessage(消息);abstractMessage.sendMessage("加班申请特批","王先生");}运行结果如下图所示。在上面的案例中,我们使用桥接模式来解耦“消息类型”和“消息紧急程度”这两个独立变化的维度。如果以后消息类型比较多,比如微信、钉钉等,只需要新建一个类继承IMessage即可;如果急需添加,只需要新建一个类来实现AbstractMessage类即可。关注微信公众号『汤姆炸弹架构』回复“设计模式”获取完整源码。【推荐】汤姆炸弹架构:30个设计模式实战案例(附源码),挑战60W年薪不是梦技术在于分享,我分享我的快乐!如果本文对您有帮助,请关注并点赞;有什么建议也可以留言或私信。您的支持是我坚持创作的动力。关注微信公众号『汤姆炸弹建筑』,获取更多技术干货!
