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

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

  • 相关阅读:
    【PKUSC2019】线弦图【计数】【树形DP】【分治FFT】
    【PKUSC2019】树染色【线段树合并】【树形DP】
    [LibreOJ 3124]【CTS2019】氪金手游【容斥原理】【概率】【树形DP】
    [LibreOJ 3119]【CTS2019】随机立方体【计数】【容斥】
    SQLServer DBA 三十问(加强版)
    解决The valid characters are defined in RFC 7230 and RFC 3986错误问题
    Oracle 11g AWR 系列五:如何生成 AWR 报告?
    转 抽象类和接口联系与区别
    [转][solr]
    【转】org.jdom.IllegalDataException: The data ""is not legal for a JDOM attribute: 0xb is not a legal 异常
  • 原文地址:https://www.cnblogs.com/shirln/p/10245241.html
Copyright © 2020-2023  润新知