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

    桥接模式(Bridge Pattern)
              也称为桥梁模式。

    将抽象部分与它的实现部分分离,使它们都能够独立地变化。


            居家生活,大家都用过电灯,开关和电灯通过电线相连接,开关控制电灯的亮与灭。

    当今各种物质产品令郎满目。五花八门。开关和电灯也是多种多样,比如:开关的种类有button式开关,声控式开关、触摸式开关、旋转式开关等。电灯的种类更是层出不穷。如白炽灯、霓虹灯、水晶灯等。

            这么多开关和电灯,假设如今在家里想换一盏水晶灯,难道要把墙抛开又一次设计线路,才干装上水晶灯吗?当然不是的。开关连通电源,电线传输电源。电灯仅仅是负责照明!各司其职。互不干扰,所以,想要换水晶灯,不必更换开关盒电线。仅仅要更换电灯集合。相同。更换开关也是如此。

                                            

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 桥接
    {
        //电灯接口
        public interface ILight
        {
            //接通电源
            void electricConnected();
            //照明
            void light();
            //断开电源
            void electricClosed();
    
        }
    
        //开关顶层类
        public class BaseSwitch
        {
            //使用组合。设置ILight为内部私有属性,此为桥梁
            protected ILight light;
    
            //构造方法将外部的light类型注入进来
            public BaseSwitch (ILight light)
            {
                this.light = light;
            }
    
            //开灯方法
            public void makeLight()
            {
                //打开开关,接通电源
                this.light.electricConnected();
                //照明
                this.light.light();
                //关闭开关,断开电源
                this.light.electricClosed();
            }
        }
    
        //遥控开关
        public class RemoteControlSwitch :BaseSwitch
        {
            //构造方法
            public RemoteControlSwitch(ILight light)
                : base(light)
            { }
    
            //使用遥控开关控制开灯
            public void makeRemoteLight(int operColor)
            {
                //打开开关,接通电源
                this.light.electricConnected();
                //照明
                this.light.light();
                string color = "";
                switch (operColor)
                {
                    case 1:
                        color = "暖色";
                        break;
                    case 2:
                        color = "蓝色";
                        break;
                    case 3:
                        color = "红色";
                        break;
                    case 4:
                        color = "白色";
                        break;
                }
                Console.WriteLine("...如今是" + color + "! ");
                //关闭开关,断开电源
                this.light.electricClosed();
            }
        }
    
        //白炽灯
        public class IncandescentLight :ILight 
        {
            //接通电源
            public void electricConnected()
            {
                Console.WriteLine("白炽灯被打开了...");
            }
            
            //断开电源
            public void electricClosed()
            {
                Console.WriteLine("白炽灯被关闭了...");
            }
    
            //照明
            public void light()
            {
                Console.WriteLine("白炽灯照明!");
            }
        }
    
        //水晶灯实现
        public class CrystalLight:ILight
        {
            //接通电源
            public void electricConnected()
            {
                Console.WriteLine("水晶灯被打开了...");
            }
            //照明
            public void light()
            {
                Console.WriteLine("水晶灯照明!");
            }
            //断开电源
            public void electricClosed()
            {
                Console.WriteLine("水晶灯被关闭了...");
            }
    
            
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                //白炽灯实例
                ILight incandescentLight = new IncandescentLight();
                //水晶灯实例
                ILight crystalLight = new CrystalLight();
    
                Console.WriteLine("-- 一般开关 --");
                //一般开关
                BaseSwitch switch1 = new BaseSwitch(incandescentLight);
                switch1.makeLight();
    
                Console.WriteLine("
    -- 遥控开关 --");
                //遥控开关
                RemoteControlSwitch switch2 = new RemoteControlSwitch(crystalLight);
                switch2.makeRemoteLight(1);
            }
        }
    }




            正如前面所说的,我们如今要用一般开关,遥控水晶灯,该怎么办呢?这时,我们仅仅要将水晶灯传入一般开关的构造方法中就可以实现!

    将一般开关部分:
    //一般开关
                BaseSwitch switch1 = new BaseSwitch(incandescentLight);
                switch1.makeLight();
    改动为:
    //一般开关
                BaseSwitch switch1 = new BaseSwitch(crystalLight);
                switch1.makeLight();



    桥接模式的类图:
                                                              

    在桥接模式结构图中包括例如以下几个角色:
            Abstraction(抽象类):用于定义抽象类的接口。它通常是抽象类而不是接口。当中定义了一个Implementor(实现类接口)类型的对象并能够维护该对象。它与Implementor之间具有关联关系。它既能够包括抽象业务方法,也能够包括详细业务方法。


            RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口,通常情况下它不再是抽象类而是详细类。它实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中能够调用在Implementor中定义的业务方法。
            Implementor(实现类接口):定义实现类的接口。这个接口不一定要与Abstraction的接口全然一致,其实这两个接口能够全然不同,一般而言,Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做很多其它更复杂的操作。

    Implementor接口对这些基本操作进行了声明,而详细实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法。还能够调用到Implementor中定义的方法,使用关联关系来替代继承关系。
            ConcreteImplementor(详细实现类):详细实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现,在程序执行时。ConcreteImplementor对象将替换其父类对象,提供给抽象类详细的业务操作方法。



    主要长处:
        1.分离抽象接口及事实上现部分。

    桥接模式使用“对象间的关联关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现能够沿着各自的维度来变化。

    所谓抽象和实现沿着各自维度的变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便不论什么组合子类。从而获得多维度组合对象。
        2.在非常多情况下。桥接模式能够代替多层继承方案。多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法。它极大降低了子类的个数。
        3.桥接模式提高了系统的可扩展性。在两个变化维度中随意扩展一个维度,都不须要改动原有系统,符合“开闭原则”。

    使用场合
        1.不希望在抽象类和它的实现部分之间有一个固定的绑定关系
        2.类的抽象及实现都应该能够通过生成子类的方法加以扩充
        3.对一个抽象的实现部分的改动应对客户不产生影响,即客户的代码不必又一次编译

    与适配器的差别:
        适配器是将一种接口转换为还有一种接口的设计模式,而桥接则是把实现和它的接口分开,以便它们能够独立地变化。桥接并非用来把一个已有的对象接到不相匹配的接口上的。








  • 相关阅读:
    hdu2328 Corporate Identity
    hdu1238 Substrings
    hdu4300 Clairewd’s message
    hdu3336 Count the string
    hdu2597 Simpsons’ Hidden Talents
    poj3080 Blue Jeans
    poj2752 Seek the Name, Seek the Fame
    poj2406 Power Strings
    hust1010 The Minimum Length
    hdu1358 Period
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6905364.html
Copyright © 2011-2022 走看看