桥接模式

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

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

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

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

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

继承会带来的麻烦?

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

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

合成/聚合复用原则

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

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

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

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

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

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

桥接的结构图

桥接模式要注意的点:

桥接模式

以下为示例代码

/// <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();
        }

相关推荐