结构型模式——桥接模式(Bridge Pattern)

开头

     今天我们学习结构型模型的第二个模式,桥接模式,我们知道结构型模型是描述对象与类之间的组合,那么今天我们学的桥接模式是如何实现类与类之间更好的搭配的呢?


内容

    我们想象我们平时买电器产品,例如空调、电视机等他们都需要佩带一个遥控器,我们可以把遥控器当做成一个抽象的类,我们只需要写出一个派生类,继承抽象类的功能即可,但是随着厂家对遥控器的功能的改变,如果此时我们将抽象类的遥控器加入某种功能,此时其他的品牌的遥控器都要发生改变,这显然是不可能的,对于电视机和遥控器这种组型向的电器,定义其中任何一个为具体类都不是很好,因为每个厂家对遥控器的实现方式都是不一致的。

桥接模式中的四大角色:Abstraction 抽象类、RefinedAbstraction 扩充抽象类、Implementor 实现类接口、ConcreteImplementor 具体实现类

第一步:定义一个电视的抽象类,不同具体品牌的电视继承电视抽象类

Implementor (实现类接口):电视类,声明一些基本的操作,功能的具体实现交给具体电视机。

ConcreteImplementor( 具体实现类):具体电视机,具体实现电视类的方法。

 // 抽象的电视类,以及电视的实现方法
    public abstract class TV
    {
        public abstract void On();//打开电视
        public abstract void Off();//关闭电视
        public abstract void Set();//更换频道
    }
    
    public class XiaoMi : TV//小米电视继承电视抽象类
    {
        public override void Off()
        {
            Console.WriteLine("关闭小米电视");
        }
        public override void On()
        {
            Console.WriteLine("打开小米电视");
        }
        public override void Set()
        {
            Console.WriteLine("更换小米电视节目");
        }
    }
    public class TCL : TV//TCL电视继承电视抽象类
    {
        public override void Off()
        {
            Console.WriteLine("关闭tcl电视");
        }
        public override void On()
        {
            Console.WriteLine("打开tcl电视");
        }
        public override void Set()
        {
            Console.WriteLine("更换TCL电视节目");
        }
    }

第二步:遥控器有两个维度,一个是不同品牌的遥控器,另一个是遥控器的功能

Abstraction (抽象类):遥控器类,在里面定义一个电视的变量,两者之间具有关联关系,而且包含自己的方法

RefinedAbstraction 扩充抽象类):具体遥控器,虽然叫扩充抽象类,但是是具体类,实现抽象类中的方法,并且扩展抽象类的方法。


客户端利用桥接模式实现调用


结果:



总结

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式


优点:(1)解耦:分离了抽象接口和实现部分,将多个维度转化为各自独立的维度。

          (2)多个子类继承父类,当其中某一个子类添加新功能时,可以不更改子类,桥接模式间接的的实现了在C#中不可以实现多重继承的的缺陷。

         (3)提高系统扩展性,维度独立化,可以扩展任意维度,不需要对原有系统进行大规模修改,符合类开闭原则。

缺点:不容易区分两大维度,使用范围具有局限性。

适用场景:(1)抽象部分和实现部分可以继承的方式独立,相互不影响。或者说一个类具有多个独立并且变化的维度

                 (2)可以打破C#中,子类无法实现多重继承的缺陷。


   关于桥接模式的学习就先学习到这里,一个多维度的类,可以变换成多个独立的维度,它们之间不再相互牵扯,每个独立的维度进行扩展功能,当两者再次组合的时候,其功能变得无限强大。特别喜欢刘伟博客里面毛笔和蜡笔的例子

假如我们需要大中小3种型号的画笔,能够绘制12种不同的颜色,如果使用蜡笔,需要准备3×12 = 36支,但如果使用毛笔的话,只需要提供3种型号的毛笔,外加12个颜料盒即可,涉及到的对象个数仅为 3 + 12 = 15,远小于36,却能实现与36支蜡笔同样的功能。如果增加一种新型号的画笔,并且也需要具有12种颜色,对应的蜡笔需增加12支,而毛笔只需增加一支。为什么会这样呢?通过分析我们可以得知:在蜡笔中,颜色和型号两个不同的变化维度(即两个不同的变化原因)融合在一起,无论是对颜色进行扩展还是对型号进行扩展都势必会影响另一个维度;但在毛笔中,颜色和型号实现了分离,增加新的颜色或者型号对另一方都没有任何影响。如果使用软件工程中的术语,我们可以认为在蜡笔中颜色和型号之间存在较强的耦合性,而毛笔很好地将二者解耦,使用起来非常灵活,扩展也更为方便。

   如果本篇博客对初学者的您有一定的帮助,记得看给小编点一下赞哦。


猜你喜欢

转载自blog.csdn.net/fjxcsdn/article/details/80380907