桥接模式

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

 

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

 

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

 

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

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

 

 

继承会带来的麻烦?

 

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

 

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

 

合成/聚合复用原则

 

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

 

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

 

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

 

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

 

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

 

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

 

桥接的结构图

 

 

桥接模式要注意的点:

以下为示例代码

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

 

posted on 2017-04-13 07:30  行周  阅读(215)  评论(0编辑  收藏  举报

导航