设计模式(C#)——06桥接模式
推荐阅读:
在早先,几乎每个手机的充电器接口都是不同的。每个型号的手机都有一个充电器,此时我们把充电器作为一个抽象类,抽象类中提供充电器的所有实现,其他具体手机品牌的充电器都继承这个抽象类。这样的实现使得每部不同型号的手机都由自己充电器实现,这样的设计对于手机的改变可以很好地应对,只需要添加一个派生类(充电器)就搞定了,但随着时间的推移,为了方便统一,研究者希望每种牌子的手机充电器能统一。这就是我们今天要介绍的桥接模式。
桥接模式
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
桥接模式要素:
(1)抽象化角色:使用实现者角色提供的接口来定义基本功能接口,持有实现者角色,并在功能接口中委托给它,起到搭建桥梁的作用;。(注意,抽象化角色并不是指它就是一个抽象类,而是指抽象了实现。)
(2)改善后的抽象化角色:作为抽象化角色的子类,增加新的功能,也就是增加新的接口(方法);与其构成类的功能层次结构;
(3)实现者角色:提供了用于抽象化角色的接口;它是一个抽象类或者接口。
(4)具体的实现者角色:作为实现者角色的子类,通过实现具体方法来实现接口;与其构成类的实现层次结构。
下面针对上面的手机充电器例子,使用代码来帮助大家理解桥接模式:
命名空间桥接模式,包含抽象化角色,改善后的抽象化角色,实现者角色,具体的实现者角色
1.创建抽象化角色Charger
/// <summary>
/// 抽象概念中的充电器,扮演抽象化角色
/// </summary>
public class Charger
{
// 字段
private Phone implementor;
// 属性
public Phone Implementor
{
get { return implementor; }
set { implementor = value; }
}
/// <summary>
/// 电压,这里抽象类中不再提供实现了,而是调用实现类中的实现
/// </summary>
public virtual void Voltage()
{
implementor.Voltage();
}
/// <summary>
/// 接口形状
/// </summary>
public virtual void Shape()
{
implementor.Shape();
}
}
2.改善后的抽象化角色
/// <summary>
/// 具体充电器
/// </summary>
public class ConcreteCharger : Charger
{
public override void Voltage()
{
Console.WriteLine("---------------------");
base.Voltage();
}
}
3.实现者角色
/// <summary>
/// 手机,提供抽象方法
/// </summary>
public abstract class Phone
{
public abstract void Voltage();
public abstract void Shape();
}
4具体的实现者角色
// <summary>
/// 小米手机,重写基类的抽象方法
/// 提供具体的实现
/// </summary>
public class XiaoMi : Phone
{
public override void Voltage()
{
Console.WriteLine("小米牌手机充电器电压");
}
public override void Shape()
{
Console.WriteLine("小米牌手机充电器接口形状");
}
}
/// <summary>
/// 华为手机,重写基类的抽象方法
/// </summary>
public class HuaWei :Phone
{
public override void Voltage()
{
Console.WriteLine("华为牌手机充电器电压");
}
public override void Shape()
{
Console.WriteLine("华为牌手机充电器接口形状");
}
}
5.使用桥接模式
/// <summary>
/// 以电视机遥控器的例子来演示桥接模式
/// </summary>
class Client
{
static void Main(string[] args)
{
// 创建一个充电器
Charger charger = new Charger();
// 小米手机
charger .Implementor = new XiaoMi();
charger .Voltage();
charger .Shape();
Console.WriteLine();
// 华为手机
charger .Implementor = new HuaWei();
charger .Voltage();
charger .Shape();
Console.Read();
}
}
上面桥接模式的实现中,充电器的功能实现方法不在充电器抽象类中去实现,而是把实现部分用另一个手机类去封装它,然而充电器中只包含手机类的一个引用,同时这样的设计也非常符合现实生活中的情况。通过桥接模式,我们把抽象化和实现化部分分离开了,这样就可以很好应对这两方面的变化了。