设计模式系列漫谈之十一 - 桥接模式
故事
在小雪的追求者中,有些是身边熟悉的朋友,有些确未曾谋面的朋友。在这几个月里,小雪一直与他们保持着正常的通讯联系。可是,其中有一位男孩给她留下深刻的印象。他是一个幽默,机智,活泼,风趣的人。日子一天天过去了,小雪对他产生一种从未有过的好奇,不止一次地在脑海里勾划他的音容笑貌。
终于有一天,小雪对他说能不能用手机发张照发给我。但是,小雪的手机只能接收来自不同手机的短信。是否有办法使小雪的手机既能接收不同手机发送的短信,也能接收不同手机发送的照片呢?
桥接模式(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);
}
}
{
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彩信;
}
}
}
{
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();
}
}
{
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";
}
}
}
{
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("您好");
}
if (mobile.GetType()=="MESSAGE")
{
mobile.SendMessage("您好");
}