Fork me on GitHub

设计模式(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();
        }
    }

      上面桥接模式的实现中,充电器的功能实现方法不在充电器抽象类中去实现,而是把实现部分用另一个手机类去封装它,然而充电器中只包含手机类的一个引用,同时这样的设计也非常符合现实生活中的情况。通过桥接模式,我们把抽象化和实现化部分分离开了,这样就可以很好应对这两方面的变化了。

posted @ 2019-01-09 16:32  爱上游戏开发  阅读(199)  评论(0编辑  收藏  举报
 >>>转载请注明出处