zoukankan      html  css  js  c++  java
  • 结构模式->桥接模式

         Bridge 实现系统可能有很多角度分类,每一类都有可能变化,那么就把这种多角度分离出来让它们独立变化。减少他们之间耦合性。

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

             桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。

            桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效控制了系统中类的个数。桥接定义如下:

           将抽象部分与它的实现部分分离,使它们都可以独立地变化。考虑装操作系统,有多种配置的计算机,同样也有多款操作系统。如何运用桥接模式呢?可以将操作系统和计算机分别抽象出来,让它们各自发展,减少它们的耦合度。当然了,两者之间有标准的接口。这样设计,不论是对于计算机,还是操作系统都是非常有利的。下面给出这种设计的UML图,其实就是桥接模式的UML图。

             给出C++的一种实现:

    //操作系统  
    class OS  
    {  
    public:  
        virtual void InstallOS_Imp() {}  
    };  
    class WindowOS: public OS  
    {  
    public:  
        void InstallOS_Imp() { cout<<"安装Window操作系统"<<endl; }   
    };  
    class LinuxOS: public OS  
    {  
    public:  
        void InstallOS_Imp() { cout<<"安装Linux操作系统"<<endl; }   
    };  
    class UnixOS: public OS  
    {  
    public:  
        void InstallOS_Imp() { cout<<"安装Unix操作系统"<<endl; }   
    };  
    //计算机  
    class Computer  
    {  
    public:  
        virtual void InstallOS(OS *os) {}  
    };  
    class DellComputer: public Computer  
    {  
    public:  
        void InstallOS(OS *os) { os->InstallOS_Imp(); }  
    };  
    class AppleComputer: public Computer  
    {  
    public:  
        void InstallOS(OS *os) { os->InstallOS_Imp(); }  
    };  
    class HPComputer: public Computer  
    {  
    public:  
        void InstallOS(OS *os) { os->InstallOS_Imp(); }  
    };
    
    int main()  
    {  
        OS *os1 = new WindowOS();  
        OS *os2 = new LinuxOS();  
        Computer *computer1 = new AppleComputer();  
        computer1->InstallOS(os1);  
        computer1->InstallOS(os2);  
    }  


    关注公众号 海量干货等你
  • 相关阅读:
    Unity 分场景打包
    Unity -- AssetBundle(本地资源加载和加载依赖关系)
    unity出的apk在较高安卓版本安装失败问题
    将一个目录下的某个格式的所有文件复制到另一个目录下
    Unity项目Assets目录下的资源存放规范
    AndroidStudio引用jar和aar包
    音频(二)_UnityAudio系统(4.AudioMixer)
    音频(二)_UnityAudio系统(3.AudioListener)
    音频(二)_UnityAudio系统(2.AudioSource)
    音频(二)_UnityAudio系统(1.AudioClip)
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734425.html
Copyright © 2011-2022 走看看