桥接模式
桥接模式的定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
我们来想象一下一种场景:现在要开发一个消息发送模块,一开始的需求就是很简单的有了消息给相关人员发送SMS短信通知和Email邮件通知。这很简单,我们实现的类图如下:
接下来很快来了新需求,要增加发送加急消息的功能,并且要向客户端提供监控功能,客户端随时可以通过这个方法了解加急消息的处理进度,于是,我们实现的类图如下:
接下来又有新变动了,又增加了特急消息处理,不需要查看处理进度,只要没完成就直接催促,于是。。。:
如果要再增加一个手机发送的需求,手机发送也要分普通消息,加急消息和特急消息,是不是每种消息都要再加一个跟手机消息相关的类?那要再增加群发消息的功能呢?这种设计缺陷就体现出来了,那我们来看看桥接模式:
这样一来,比如我们再增加一个手机消息,只需要在MessageImplementor下增加一个MessagePhone实现类就可以了,完全不影响左边部分抽象类AbstractMessage及其子类,这一部分就是桥接模式概念中提到的抽象部分,而右边部分接口MessageImplementor及其实现类,就是概念中提到的实现部分,现在这两部分分离开来,各自独立的变化互不影响。
通过抽象部分拥有实现部分的接口对象,就实现了桥接。
桥接模式就是用来解决这种两个变化维度的情况下,如何灵活地扩展功能的一个很好的方案。其实,桥接模式主要是把继承改成了使用对象组合,从而把两个维度分开,让每一个维度单独的变化,最后通过对象组合的方式,把两个维度组合起来,每一种组合的方式就相当于原来继承中的一种实现,这样就有效地减少了实际实现的类的个数。
public class Client { public static void main(string[] args) { //创建具体实现对象 MessageImplementor impl=new MessageSMS(); //创建一个普通消息对象 AbstractMessage m=new CommonMessage(impl); m.sendMessage("请喝一杯茶","小李"); //创建一个紧急消息对象 m=new UrgencyMessage(impl); m.sendMessage("请喝一杯茶","小李"); //创建一个特急消息对象 m=new SpecialMessage(impl); m.sendMessage("请喝一杯茶","小李"); //把实现方式切换成手机短消息 MessageImplementor impl=new MessagePhone(); AbstractMessage m=new CommonMessage(impl); m.sendMessage("请喝一杯茶","小李"); m=new UrgencyMessage(impl); m.sendMessage("请喝一杯茶","小李"); m=new SpecialMessage(impl); m.sendMessage("请喝一杯茶","小李"); } }