设计模式-结构型-桥接模式
设计模式-结构型-适配器模式
文章目录
桥接模式
通过组合的方式建立两个类之间的联系,核心在于把抽象与实现解耦。(抽象与实现是指的两个独立的变化维度,其中抽象包含实现,一个抽象类的变化可能涉及多种维度的变化)。
一、桥接模式是什么?
桥接模式又叫桥梁模式,接口模式,或者柄体模式
是指的抽象部分与具体实现部分分离,使他们可以独立的变化。
1.角色
- 抽象(Abstraction):该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现,抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象)。
- 修正抽象(RefindAbstraction):Abstraction的具体实现,对Abstraction的方法进行完善和扩展。
- 实现(IImplementor):确定实现维度的基本操作,提供给Abstraction使用,该类一般为接口或抽象类。
- 具体实现(ConcreteImplementor):IImplementor的具体实现。
2.应用场景
- 在抽象和具体实现之间需要增加更多灵活性的场景。
- 解决多层继承导致的系统类的个数巨增,父类实现共性,子类实现特性,当多层继承时,导致子类的方法过多。所以考虑用桥接模式的组合聚合达到继承的效果。
3.优缺点
a.优点
- 分离抽象部分及具体实现部分,
- 提高了系统的可扩展性
- 符合开闭原则
- 符合合成复用原则
b.优点
- 增加了系统的理解和设计难度
- 需要正确的识别系统中两个独立变化的维度。
二、使用步骤
1.应用场景说明
2.定义实现消息发送的统一接口
代码如下(示例):
/// <summary>
/// 实现消息发送的统一接口
/// </summary>
public interface IMessage
{
void SendMsg(string metting, string name);
}
2.按照消息类型实现发送接口
代码如下(示例):
/// <summary>
/// 邮件消息实现
/// </summary>
public class EmailMessage : IMessage
{
public void SendMsg(string metting, string name)
{
Console.WriteLine($"Send Email Message To<{name}>,Message Text:{metting}");
}
}
/// <summary>
/// 短信消息实现
/// </summary>
public class SMSMessage : IMessage
{
public void SendMsg(string metting, string name)
{
Console.WriteLine($"Send SMS Message To<{name}>,Message Text:{metting}");
}
}
3.创建桥接抽象角色
代码如下(示例):
/// <summary>
/// 桥接抽象类
/// </summary>
public class AbstractMessage
{
private IMessage _message;
public AbstractMessage(IMessage message)
{
_message = message;
}
public virtual void SendMsg(string metting, string name)
{
_message.SendMsg(metting, name);
}
}
4.创建具体实现桥接抽象类
代码如下(示例):
/// <summary>
/// 普通消息
/// </summary>
public class NomalMessage : AbstractMessage
{
public NomalMessage(IMessage message) : base(message)
{
}
public override void SendMsg(string metting, string name)
{
base.SendMsg(metting, name);
}
}
/// <summary>
/// 加急消息
/// </summary>
public class UrgencyMessage : AbstractMessage
{
public UrgencyMessage(IMessage message) : base(message)
{
}
public override void SendMsg(string metting, string name)
{
base.SendMsg(metting, name);
}
}
5.客户端应用代码
代码如下(示例):
/// <summary>
/// 客户端应用代码
/// </summary>
public class MessageSendClient
{
public void SendMessageClient()
{
IMessage msg = new EmailMessage();
AbstractMessage amsg = new AbstractMessage(msg);
amsg.SendMsg("邮件消息:默认", "Chen");
amsg = new NomalMessage(msg);
amsg.SendMsg("邮件消息:普通", "Chen");
amsg = new UrgencyMessage(msg);
amsg.SendMsg("邮件消息:加急", "Chen");
}
}
6.后续代码扩展
上述案例案例中,使用桥接模式对消息类型及消息紧急程度两个独立变化的维度进行了解耦。
扩展消息类型:增加EmailMessage的兄弟类,实现IMessage(***实现***抽象接口)。
扩展紧急程度:增加NomalMessage的兄弟类,并继承AbstractMessage
总结
` 桥接模式遵循了里氏替换原则和依赖导致原则,最终实现了开闭原则(对修改关闭,对扩展开放)。