• C#设计模式——桥接模式(Bridge Pattern)


    一、概述
    在软件开发中,我们有时候会遇上一个对象具有多个变化维度。比如对汽车对象来说,可能存在不同的汽车类型,如公共汽车、轿车等,也可能存在不同的发动机,如汽油发动机、柴油发动机等。对这类对象,可应用桥接模式来增强系统灵活度,避免由于多维度变化带来的复杂性。
    二、桥接模式
    桥接模式利用对象的组合关系将不同的变化维度分离,使其可以沿着各自的维度来变化。其结构图如下:

    Abstraction定义了抽象类,并包含Implementor对象。
    RefinedAbstraction实现了抽象类。
    Implementor定义了另一个变化维度。
    ConcreteImplementor提供了第二个变化维度接口的具体实现。
    三、示例
    我们利用桥接模式来实现前述的汽车对象
    首先定义Abstraction。

     1     public abstract class Car
     2     {
     3         public IEngine _engine;
     4 
     5         public Car(IEngine engine)
     6         {
     7             _engine = engine;
     8         }
     9 
    10         public virtual void Start()
    11         {
    12             _engine.Start();
    13         }
    14 
    15         public virtual void Stop()
    16         {
    17             _engine.Stop();
    18         }
    19     }

    接着实现不同的汽车类型。

     1     public class Bus : Car
     2     {
     3         public Bus(IEngine engine)
     4             : base(engine)
     5         {
     6         }
     7 
     8         public override void Start()
     9         {
    10             base.Start();
    11             Console.WriteLine("Bus Start");
    12         }
    13 
    14         public override void Stop()
    15         {
    16             base.Stop();
    17             Console.WriteLine("Bus Stop");
    18         }
    19     }
    20 
    21     public class Limousine : Car
    22     {
    23         public Limousine(IEngine engine)
    24             : base(engine)
    25         {
    26         }
    27 
    28         public override void Start()
    29         {
    30             base.Start();
    31             Console.WriteLine("Limousine Start");
    32         }
    33 
    34         public override void Stop()
    35         {
    36             base.Stop();
    37             Console.WriteLine("Limousine Stop");
    38         }
    39     }

    再定义第二个变化维度,即发动机的接口。

    1     public interface IEngine
    2     {
    3         void Start();
    4         void Stop();
    5     }

    最后实现不同的发动机。

     1     public class GasEngine : IEngine
     2     {
     3         public void Start()
     4         {
     5             Console.WriteLine("Gas Engine Start");
     6         }
     7 
     8         public void Stop()
     9         {
    10             Console.WriteLine("Gas Engine Stop");
    11         }
    12     }
    13 
    14     public class DieselEngine : IEngine
    15     {
    16         public void Start()
    17         {
    18             Console.WriteLine("Diesel Engine Start");
    19         }
    20 
    21         public void Stop()
    22         {
    23             Console.WriteLine("Diesel Engine Stop");
    24         }
    25     }
  • 相关阅读:
    不懂区块链?先来看一下这篇
    ZooKeeper 分布式共享锁的实现
    关于 use-default-filters 属性的说明
    MapReduce 入门之一步步自实现词频统计功能
    Spring、SpringMVC、SpringData + JPA 整合详解
    使用 Hadoop 进行语料处理(面试题)
    顺序线性表 ---- ArrayList 源码解析及实现原理分析
    JPA + SpringData 操作数据库 ---- 深入了解 SpringData
    JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA
    JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA
  • 原文地址:https://www.cnblogs.com/saville/p/2803748.html
Copyright © 2020-2023  润新知