设计模式系列漫谈之十一 - 桥接模式

故事

      在小雪的追求者中,有些是身边熟悉的朋友,有些确未曾谋面的朋友。在这几个月里,小雪一直与他们保持着正常的通讯联系。可是,其中有一位男孩给她留下深刻的印象。他是一个幽默,机智,活泼,风趣的人。日子一天天过去了,小雪对他产生一种从未有过的好奇,不止一次地在脑海里勾划他的音容笑貌。

      终于有一天,小雪对他说能不能用手机发张照发给我。但是,小雪的手机只能接收来自不同手机的短信。是否有办法使小雪的手机既能接收不同手机发送的短信,也能接收不同手机发送的照片呢?

桥接模式(Bridge)的解决方案
      GOF指出,桥接模式将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。换言之,使两个维度的变化分离。
      抽象化:存在于多个实体中的共同的概念性联系,就是抽象化。如不同的手机品牌(NOKIA、MOTOROLA)。
      实现化:抽象化给出的具体实现,就是实现化。如发送的信息类型(普通短信、彩信)
      桥接模式定义的角色:
      抽象化角色(Mobile):抽象化接口定义
      具体抽象化角色(NOKIA、MOTORALA):抽象化具体实现
      实现化角色(Type):实现化接口定义
      具体实现化角色(MessageType、PictureType):实现化角色接口的具体实现

抽象化角色如下:

namespace XiaoXue
{
      
public abstract Mobile
      {
            
public Type _type;
            
public Mobile(Type type)
            {
                  
this._type=type;
            }
            
public abstract void SendMessage(object msg);
            
public abstract void SendPictue(object pic);
      }
}

具体抽象化角色如下:

namespace XiaoXue
{
      
public class NOKIA : Mobile
      {
            
public NOKIA(Type type):base(type)
            {
            }
            
public override void SendMessage(object msg)
            {
                  
//发送NOKIA短信;
            }
            
public override void SendMessage(object msg)
            {
                   
//发送NOKIA彩信;
            }
      }

      
public class MOTOROLA : Mobile
      {
            
public MOTOROLA (Type type):base(type)
            {
            }
            
public override void SendMessage(object msg)
            {
                   
//发送MOTOROLA短信;
            }
            
public override void SendMessage(object msg)
            {
                  
//发送MOTOROLA彩信;
            }
      }
}

实现化角色如下:

namespace XiaoXue
{
      
public abstract class Type
      {
            
public abstract string GetType();
      }
}

具体实现化角色如下:

namespace XiaoXue
{
      
public class MessageType:Type
      {
            
public override string GetType()
            {
                  
return "MESSAGE";
            }
      }
      
public class PictureType:Type
      {
            
public override string GetType()
            {
                  
return "PICTURE";
            }
      }
}

客户端调用如下:

Moblile mobile=new NOKIA(new MessageType())
if (mobile.GetType()=="MESSAGE")
{
       mobile.SendMessage(
"您好");
}
posted @ 2007-12-24 13:14  李华星  阅读(434)  评论(0编辑  收藏  举报