桥接模式

桥接模式的定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

我们来想象一下一种场景:现在要开发一个消息发送模块,一开始的需求就是很简单的有了消息给相关人员发送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("请喝一杯茶","小李");
   }    
}

 

posted @ 2023-07-03 09:18  何塞穆里尼奥  阅读(15)  评论(0编辑  收藏  举报