风动破

导航

设计模式之桥接bridge

http://www.cnblogs.com/libingql/p/3496075.html
桥接模式应用分析
  桥接模式可以适用于以下情形:
  ◊ 不希望在抽象与实现部分之间有固定的绑定关系;
  ◊ 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
这时桥接模式可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充;
  ◊ 对抽象的实现部分进行修改应对客户不产生影响,即客户的代码不必重新编译;
  ◊ 想对客户完全隐藏抽象的实现部分;
  ◊ 想在多个对象间共享实现,但同时要求客户并不知道这点。
  桥接模式具有以下特点:
  ◊ 分离接口及其实现部分,一个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现;
  ◊ 将Abstraction与Implementor分离有助于降低对实现部分编译时刻的依赖性;当改变一个实现类时,并不需要重新编译Abstraction类和Client类。
为了保证一个类库的不同版本之间的兼容,需要有这个特性;
  ◊ 接口与实现分离有助于分层,从而产生更好的结构化系统。系统的高层部分仅需要知道Abstraction和Implementor即可;
  ◊ 提高可扩充性。可以独立的对Abstraction和Implementor层次结构进行扩充;
  ◊ 实现细节对Client透明。可以对Client隐藏实现细节,如共享Implementor对象以及相应的引用计数机制
以一杯咖啡为例,子类有四个:中杯加奶、大杯加奶、中杯不加奶、大杯不加奶。
这四个类实际是两个角色的组合:抽象和行为。其中抽象为中杯和大杯,行为为加奶和不加奶。
这种从分离抽象和行为的角度的方法称为桥接模式。

===============================================================

public class BridgeMode

 

    {
        public BridgeMode() 
        {
            MakeCofeSingleton milkcafe = new MakeCofeSingleton(new MilkCafe());
            MiddleCofe middleCofe = new MiddleCofe();
            middleCofe.Make();
            MakeCofeSingleton blackcafe = new MakeCofeSingleton(new BlackCafe());
            LargeCafe largeCofe = new LargeCafe();
            largeCofe.Make();
        }
    }
    public class MakeCofeSingleton {
        private static MakeCofe _instance;
        public MakeCofeSingleton(MakeCofe instance) 
        {
            _instance = instance;
        }
        public static MakeCofe Instance()
        {
            return _instance;
        }
    }
    /// <summary>
    /// 做咖啡
    /// </summary>
    public abstract class MakeCofe {
        public abstract void Making();
    }
    public abstract class Cafe {
        private MakeCofe cafe;
        public Cafe() {
            cafe = MakeCofeSingleton.Instance();
        }
        public MakeCofe MakeCafe()
        {
            return this.cafe;
        }
        public abstract void Make();
    }
    public class MiddleCofe : Cafe
    {
        public override void Make()
        {
            MakeCofe makeCoffee = this.MakeCafe();
            Console.Write("中杯");
            makeCoffee.Making();
        }
    }
    public class LargeCafe : Cafe {
        public override void Make()
        {
            MakeCofe makeCoffee = this.MakeCafe();
            Console.Write("大杯");
            makeCoffee.Making();
        }
    }
    /// <summary>
    /// 原味咖啡
    /// </summary>
    public class BlackCafe : MakeCofe
    {
        public override void Making()
        {
            Console.WriteLine("原味咖啡");
        }
    }
    /// <summary>
    /// 牛奶咖啡
    /// </summary>
    public class MilkCafe : MakeCofe
    {
        public override void Making()
        {
            Console.WriteLine("牛奶咖啡");
        }
    }

posted on 2015-05-04 11:23  风动破  阅读(129)  评论(0)    收藏  举报