zoukankan      html  css  js  c++  java
  • 设计模式(7)桥接模式

    模式介绍

    桥接模式试图将抽象与它的实现解耦,使得两者可以独立地变化。

    示例

    现实中,我哥有某种疾病,所以不能吃包含谷类麦类的食物。
    我们以此为例,构建一个从不同餐馆购买特供的食物。

    interface IOrder { }
    class DairyFreeOrder : IOrder { }//无奶的
    class GlutenFreeOrder : IOrder { }//无谷蛋白的
    

    如果我们还想知道食物是哪家餐馆的,那就会这么写:

    interface IOrder { }
    class DairyFreeOrder : IOrder { }
    class GlutenFreeOrder : IOrder { }
    interface IDinerOrder : IOrder { }
    class DinerDairyFreeOrder : DairyFreeOrder, IDinerOrder { }
    class DinerGlutenFreeOrder : GlutenFreeOrder, IDinerOrder { }
    interface IFancyRestaurantOrder : IOrder { }
    class FancyRestaurantDairyFreeOrder : DairyFreeOrder, IFancyRestaurantOrder { }
    class FancyRestaurantGlutenFreeOrder : GlutenFreeOrder, IFancyRestaurantOrder { }
    

    我们建模两个正交属性,就需要3个接口和6个类,有些过分了。
    这个时候,桥接模式就发挥作用了,它划分接口责任使之可以重用:

    interface IOrder { }
    class DairyFreeOrder : IOrder { } 
    class GlutenFreeOrder : IOrder { } 
    
    interface IRestaurantOrder : IOrder { }
    class DinerOrder : IRestaurantOrder { }
    class FancyRestaurantOrder : IRestaurantOrder { }
    

    接下来,我们详细使用桥接模式。
    首先,我们先写Implementor用于定义发订单的接口IOrderingSystem

    /// <summary>
    /// Implementor which defines an interface for placing an order
    /// </summary>
    public interface IOrderingSystem
    {
        void Place(string order);
    }
    

    其次,我们定义一个抽象的SendOrder类,内部对Implementor进行引用

    /// <summary>
    /// Abstraction which represents the sent order and maintains a reference to the restaurant where the order is going.
    /// </summary>
    public abstract class SendOrder
    {
        //Reference to the Implementor
        public IOrderingSystem _restaurant;
    
        public abstract void Send();
    }
    

    SendOrder的具体实现

    /// <summary>
    /// RefinedAbstraction for a dairy-free order
    /// </summary>
    public class SendDairyFreeOrder : SendOrder
    {
        public override void Send()
        {
            _restaurant.Place("Dairy-Free Order");
        }
    }
    
    /// <summary>
    /// RefinedAbstraction for a gluten free order
    /// </summary>
    public class SendGlutenFreeOrder : SendOrder
    {
        public override void Send()
        {
            _restaurant.Place("Gluten-Free Order");
        }
    }
    

    OrderingSystem具体实现

    /// <summary>
    /// ConcreteImplementor for an ordering system at a diner.
    /// </summary>
    public class DinerOrders : IOrderingSystem
    {
        public void Place(string order)
        {
            Console.WriteLine("Placing order for " + order + " at the Diner.");
        }
    }
    
    /// <summary>
    /// ConcreteImplementor for an ordering system at a fancy restaurant.
    /// </summary>
    public class FancyRestaurantOrders : IOrderingSystem
    {
        public void Place(string order)
        {
            Console.WriteLine("Placing order for " + order + " at the Fancy Restaurant.");
        }
    }
    

    客户端调用

    static void Main(string[] args)
    {
        SendOrder _sendOrder = new SendDairyFreeOrder();
        _sendOrder._restaurant = new DinerOrders();
        _sendOrder.Send();
    
        _sendOrder._restaurant = new FancyRestaurantOrders();
        _sendOrder.Send();
    
        _sendOrder = new SendGlutenFreeOrder();
        _sendOrder._restaurant = new DinerOrders();
        _sendOrder.Send();
    
        _sendOrder._restaurant = new FancyRestaurantOrders();
        _sendOrder.Send();
    
        Console.ReadKey();
    }
    

    总结

    当设计可能存在多种不同类型继承的系统时,该模式非常有用。

    源代码

    https://github.com/exceptionnotfound/DesignPatterns/tree/master/Bridge

    原文

    https://www.exceptionnotfound.net/the-daily-design-pattern-bridge/

  • 相关阅读:
    Qt QString判断是否是数字
    Qt 判断QString中的字符串是否为纯数字
    Qt delete和deletelater的区别
    Qt QTcpSocket waitForReadyRead()等函数用法——客户端开关读写应用笔记
    Notepad++对比两个文件不同的方法
    Qt error C1071 :在注释中遇到意外的文件结束
    Qt error C2601: “...”: 本地函数定义是非法的
    Qt 错误 C1071 在注释中遇到意外的文件结束 的解决办法
    Qt 串口和线程的简单结合(通过子线程操作串口、movetothread)
    Qt 实现多线程的串口通信
  • 原文地址:https://www.cnblogs.com/talentzemin/p/9835562.html
Copyright © 2011-2022 走看看