zoukankan      html  css  js  c++  java
  • C#设计模式——桥接模式

    一、桥接模式介绍:

    桥接模式即将抽象部分与实现部分脱耦,实现抽象化与实现化的解耦,使它们相互独立互不影响到对方,使它们可以独立变化。

    二、使用场景:

    1. 如果一个系统需要在构件的抽象化角色和具体化角色之间添加更多的灵活性,避免在两个层次之间建立静态的联系。
    2. 设计要求实现化角色的任何改变不应当影响客户端,或者实现化角色的改变对客户端是完全透明的。
    3. 需要跨越多个平台的图形和窗口系统上。
    4. 一个类存在两个独立变化的维度,且两个维度都需要进行扩展。

    三、情景例子:

    我们每个品牌的空调都有一个自己的遥控器,我们如果把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体空调品牌的遥控器都继承这个抽象类,这样的实现使得每部不同型号的空调都有自己遥控器实现。这样的设计对于空调型号的改变可以很好地应对,只需要添加一个子类就行了,但用户如果需要改变遥控器的功能,此时就需要修改遥控器抽象类的提供的接口了,此时可能只需要向抽象类中添加一个方法就可以解决了,但是这样带来的问题是我们改变了抽象的实现,如果用户需要同时改变空调型号和遥控器功能时,就会导致相当大的修改,显然这样的设计并不好,然而使用桥接模式可以很好地解决这个问题。

    四、具体代码:

    实现化部分代码:

    1、创建空调抽象类,提供抽象行为方法:

        /// <summary>
        /// 抽象空调类,提供抽象方法
        /// </summary>
        public abstract class AirConditioner
        {
            public abstract void On();
            public abstract void Off();
            public abstract void TransitionMode();
        }

    2、创建具体空调实现类,实现具体方法:

        /// <summary>
        /// 格力空调类,提供具体实现
        /// </summary>
        public class Gree : AirConditioner
        {
            public override void Off()
            {
                Console.WriteLine("打开格力空调");
            }
    
            public override void On()
            {
                Console.WriteLine("关闭格力空调");
            }
    
            public override void TransitionMode()
            {
                Console.WriteLine("格力空调切换模式");
            }
        }
        /// <summary>
        /// 美的空调,提供具体实现
        /// </summary>
        public class Midea : AirConditioner
        {
            public override void Off()
            {
                Console.WriteLine("打开美的空调");
            }
    
            public override void On()
            {
                Console.WriteLine("关闭美的空调");
            }
    
            public override void TransitionMode()
            {
                Console.WriteLine("美的空调切换模式");
            }
        }

    抽象化部分代码:

    1、创建抽象遥控器,扮演抽象化角色,但不提供实现,而是调用实现类中的实现:

        public class RemoteControl
        {
            private AirConditioner specific_implementation;
            public AirConditioner Specific_Implementation { get { return specific_implementation; } set { specific_implementation = value; } }
    
            /// <summary>
            /// 开空调
            /// </summary>
            public virtual void On()
            {
                specific_implementation.On();
            }
    
            /// <summary>
            /// 关空调
            /// </summary>
            public virtual void Off()
            {
                specific_implementation.Off();
            }
    
            /// <summary>
            /// 换模式
            /// </summary>
            public virtual void SetMode()
            {
                specific_implementation.TransitionMode();
            }
        }

    2、创建具体遥控器:

        /// <summary>
        /// 具体遥控器
        /// </summary>
        public class ConcreteRemoteControl:RemoteControl
        {
            public override void SetMode()
            {
                base.SetMode();
                Console.WriteLine("========================");
            }
        }

    3、调用

            static void Main(string[] args)
            {
                //创建一个遥控器对象
                RemoteControl remotecontrol = new ConcreteRemoteControl();
    
                //格力空调
                remotecontrol.Specific_Implementation = new Gree();
                remotecontrol.On();
                remotecontrol.Off();
                remotecontrol.SetMode();
    
                //美的空调
                remotecontrol.Specific_Implementation = new Midea();
                remotecontrol.On();
                remotecontrol.Off();
                remotecontrol.SetMode();
    
                Console.ReadKey();
            }

    五、总结:

    优点:

    • 把抽象接口与其实现解耦。
    • 抽象和实现可以独立扩展,不会影响到对方。
    • 实现细节对客户透明,对用于隐藏了具体实现细节。

    缺点: 

    • 增加了系统的复杂度
  • 相关阅读:
    httpclient + TestNG 接口自动测试 第二章
    httpclient + TestNG 接口自动测试 第一章
    Kafka-manager启动命令
    多台服务器搭建Spark集群
    Scala学习 -- 基础语法
    Spark学习 -- RDD
    Spark 学习
    Angular constructor和OnInit的区别和适用场景
    TypeScript基础学习 —— 变量声明
    TypeScript基础学习 —— 基础类型
  • 原文地址:https://www.cnblogs.com/jiechou/p/9094723.html
Copyright © 2011-2022 走看看