zoukankan      html  css  js  c++  java
  • 桥接模式

    桥接模式的意图,与适配器很相似

    适配器,将原有的接口转换成另一种接口,不改变原有接口,达到不同的接口适配

    桥接模式,在变化的点之间,架起一种桥,使得可以很方便的与不同的点进行统一的通信

    比如:游戏安装在不同的机器上,游戏的低层接口都是统一的,针对于不同的平台

    低层的实现方式不一样,只需要保证游戏在不同的机器上可以实现同样的效果

    继承会带来的麻烦?

    对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现

    子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现的任何变化都会导致子类发生变化,当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换,这种依懒关系限制了灵活性并最终限制了复用性

    合成/聚合复用原则

    尽量使用合成聚合,尽量不要使用类继承

    聚合表示一种弱的拥有关系

    合成表示一种强的拥有关系,体现了严格的部分和整体的关系

    合成/聚合复用原则的好处

    优先使用对象的合成聚合将有助于保持每个类被封装,并被集中在单个任务上

    这样类类继承层层次会保持较小的规模,并且不大可能增长为不可控制的庞然大物

    桥接的结构图

     

    桥接模式要注意的点:

    以下为示例代码

    /// <summary>
        /// 通过这个类将refiendabstraction与concreteImplementorB或者C关联起来
        /// </summary>
        class Abstraction
        {
            protected Implementor Implementor;
    
            public void SetImplementor(Implementor implementor)
            {
                this.Implementor = implementor;
            }
    
            public virtual void Operation()
            {
                Implementor.Operation();
            }
        }
     class RefiendAbstraction:Abstraction
        {
            public override void Operation()
            {
                Implementor.Operation();
            }
        }
     abstract  class Implementor
      {
          public abstract void Operation();
      }
    class ConcreteImplementorA:Implementor
        {
            public override void Operation()
            {
                Console.WriteLine("ConcreteImplementorA的实现方式");
            }
        }
    class ConcreteImplementorB:Implementor
        {
            public override void Operation()
            {
                Console.WriteLine("ConcreteImplementorB的实现方式");
            }
        }
    static void Main(string[] args)
            {
                Abstraction abstraction=new RefiendAbstraction();
                abstraction.SetImplementor(new ConcreteImplementorA());
                abstraction.Operation();
                abstraction.SetImplementor(new ConcreteImplementorB());
                abstraction.Operation();
                Console.ReadLine();
            }
  • 相关阅读:
    Postgresql
    Partitioning with PostgreSQL v11 (转发)
    Partitioning with PostgreSQL v11 (转发)
    What is Data Partitioning?(转发)(未完待续)
    How to use table partitioning to scale PostgreSQL(转发)
    PostgreSQL 创建分区表(转发)
    json vs jsonb
    性能不佳的多线程应用程序的常见模式(microsoft)
    提高.net程序性能和稳定性-CLR Profile(转发)
    检查c#代码内存泄露工具-CLR Profiler工具使用(转发)
  • 原文地址:https://www.cnblogs.com/gdnyfcuso/p/6702181.html
Copyright © 2011-2022 走看看