博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式总结篇系列:桥接模式(Bridge)
阅读量:6267 次
发布时间:2019-06-22

本文共 1999 字,大约阅读时间需要 6 分钟。

在实际类设计过程中,有时会遇到此类情况:由于实际的需要,某个类具有两个或两个以上的维度变化,如果利用继承将每种可能的变化情况都定义成一个类,一是会导致类膨胀的问题,二是以后不太好维护和并且违背类的设计原则。那么面对这种情况,类改如何设计呢?这就是本文所要讲到的桥接模式。

简单的讲,桥接模式是指:将抽象和行为划分开来,从而将各个可能变化的维度分离开来,各自独立成一个类,但是能够动态的组合。

貌似有点抽象,下面通过一个简单的例子来理解桥接模式。

我们可以通过Email发送信息,也可以手段短信发送信息(当然,以后很可能新增电报发信息等等),同时,根据信息的紧急程度,还可以分为紧急和普通(当然以后可能新增不紧急、特别紧急等等),桥接模式中类该怎么设计呢?

1.首先抽离出两个变化的维度:信息类型和和发信息的方式:

发信息接口:

1 interface SendMsgInterface {2 3     public void sendMsg();4 5 }

信息类型的抽象类:

复制代码
1 abstract class Msg { 2  3     private SendMsgInterface smi; 4  5     public Msg(SendMsgInterface smi) { 6         this.smi = smi; 7     } 8  9     public abstract void send();10 11 }
复制代码

2.定义Emil发送方式类和Sms方式发送类:

复制代码
1 class EmailSendMsg implements SendMsgInterface{2 3     @Override4     public void sendMsg() {5         System.out.println("Email 方式发送");6     }7     8 }
复制代码
复制代码
1 class SmsSendMsg implements SendMsgInterface{2 3     @Override4     public void sendMsg() {5         System.out.println("Sms 方式发送");6     }7     8 }
复制代码

3.定义紧急信息和普通信息类:

复制代码
1 class ImportantMsg extends Msg { 2  3     public ImportantMsg(SendMsgInterface smi) { 4         super(smi); 5     } 6  7     @Override 8     public void send() { 9         System.out.println("紧急信息");10     }11 12 }
复制代码
复制代码
1 class NormalMsg extends Msg { 2  3     public NormalMsg(SendMsgInterface smi) { 4         super(smi); 5     } 6  7     @Override 8     public void send() { 9         System.out.println("普通信息");10     }11     12 }
复制代码

4.客户端测试:

复制代码
public class BridgeTest {    public static void main(String[] args) {        // 以手机短信发送发送紧急信息        SendMsgInterface smdSendMsg = new SmsSendMsg();        Msg importantMsg = new ImportantMsg(smdSendMsg);        importantMsg.send();    }}
复制代码

看,桥接模式对于多个维度的变化处理起来很有优势。

按照其他的模式定义,如外观模式需要增加一个外观类,代理模式需要增加一个代理类等,在如上的桥接模式设计中,其实Msg已经隐含的作为桥接的父类,当然,设计模式是死的,人是活的,其实也可以单独定义出一个专门用于桥接目的的桥接类。

 

---------------------------------------------------------------------------------
笔者水平有限,若有错漏,欢迎指正,如果转载以及CV操作,请务必注明出处,谢谢!
分类:
本文转自Windstep博客园博客,原文链接:http://www.cnblogs.com/lwbqqyumidi/p/3758159.html,如需转载请自行联系原作者
你可能感兴趣的文章
[javase学习笔记]-8.3 statickeyword使用的注意细节
查看>>
Spring集成RabbitMQ-使用RabbitMQ更方便
查看>>
Nginx 设置域名转向配置
查看>>
.net core 实现简单爬虫—抓取博客园的博文列表
查看>>
FP-Tree算法的实现
查看>>
Android 用Handler和Message实现计时效果及其中一些疑问
查看>>
Dos命令删除添加新服务
查看>>
C#.NET常见问题(FAQ)-索引器indexer有什么用
查看>>
hadoop YARN配置参数剖析—MapReduce相关参数
查看>>
Java 正则表达式详细使用
查看>>
【ADO.NET】SqlBulkCopy批量添加DataTable
查看>>
SqlServer--bat批处理执行sql语句1-osql
查看>>
Linux系列教程(十八)——Linux文件系统管理之文件系统常用命令
查看>>
laravel安装初体验
查看>>
用yum查询想安装的软件
查看>>
TIJ -- 吐司BlockingQueue
查看>>
数据库分页查询
查看>>
[编程] C语言枚举类型(Enum)
查看>>
[Javascript] Compose multiple functions for new behavior in JavaScript
查看>>
ASP.NET MVC性能优化(实际项目中)
查看>>