• Bridge(桥接)-对象结构型模式


    1.意图

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

    2.动机

        在抽象类与它的实现之间起到桥梁作用,使它们可以独立地变化。

    3.适用性

    • 不希望在抽象和它的实现部分之间有一个固定的绑定关系。这种情况可能是因为,在程序运行时刻实现部分可以被选择或切换。
    • 类的抽象以及它的实现部分都应该可以通过生成子类的方式加以扩充。这时桥接模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
    • 对一个抽象实现部分的修改的修改不应该对客户产生影响,即客户代码不必要重新编译。
    • 对客户完全隐藏抽象的实现部分。C++中类的表示在类接口中是可见的。
    • 有许多类要生成,这样一种类层次结构说明你必须将一个对象分解成两部分。

    4.结构

        

    5.代码实例

        

    复制代码
    #include <memory>
    
    class  AbstactionImpl;
    
    class Abstration
    {
    public:
        void virtual Operaion()=0;
        void virtual SetImpl(std::shared_ptr<AbstactionImpl>& pImpl)=0;
    protected:
    
        std::shared_ptr<AbstactionImpl> m_pImpl;
    
    };
    
    class RedefinedAbstration : public Abstration
    {
    public:
        void Operaion();
        void SetImpl(std::shared_ptr<AbstactionImpl>& pImpl);
    };
    复制代码
    复制代码
    class AbstactionImpl
    {
    public:
        void virtual OperationImpl()=0;
    };
    
    
    class ConcreteImplentorA : public AbstactionImpl
    {
    public:
        void  OperationImpl();
    };
    
    class ConcreteImplentorB : public AbstactionImpl
    {
    public:
        void  OperationImpl();
    };
    复制代码
    复制代码
    #include "Abstration.h"
    #include "Implentor.h"
    
    void RedefinedAbstration::Operaion()
    {
        m_pImpl->OperationImpl();
    }
    
    void RedefinedAbstration::SetImpl(std::shared_ptr<AbstactionImpl>& pImpl)
    {
        m_pImpl = pImpl;
    }
    复制代码
    复制代码
    #include <iostream>
    #include "Implentor.h"
    
    
    void ConcreteImplentorA::OperationImpl()
    {
        std::cout<<"ConcreteImplenorA Exectued" <<std::endl;
    }
    
    void ConcreteImplentorB::OperationImpl()
    {
        std::cout<<"ConcreteImplentorB Exectued"<<std::endl;
    }
    复制代码
    复制代码
    #include <memory>
    #include "Abstration.h"
    #include "Implentor.h"
    
    int main()
    {
    
        std::shared_ptr<AbstactionImpl> pConcreteImplA(new ConcreteImplentorA);
        std::shared_ptr<AbstactionImpl> pConcreteImplB(new ConcreteImplentorB);
    
        std::shared_ptr<RedefinedAbstration> pRedefinedAbstration(new RedefinedAbstration);
        pRedefinedAbstration->SetImpl(pConcreteImplA);
        pRedefinedAbstration->Operaion();
    
        pRedefinedAbstration->SetImpl(pConcreteImplB);
        pRedefinedAbstration->Operaion();
    
        while(1);
    
    }
    复制代码

    6.测试结果

        

    7.效果

    • 分离接口及其实现部分 一个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现。将Abstraction和Implementor分离有助于降低对实现部分编译时刻的依赖性,当改变一个实现类时,并不需要重新编译Abstaction类和它的客户程序。
    • 提高可扩充性 可以独立地对Abstraction和Implementor层次结构进行扩充。
    • 实现细节对客户透明 可以对客户隐藏实现细节。
  • 相关阅读:
    第一百二十七节,JavaScript,JSON数据类型转换,数据转换成字符串,字符串转换成数据
    第一百二十六节,JavaScript,XPath操作xml节点
    第一百二十五节,JavaScript,XML
    第一百二十四节,JavaScriptCookie与存储
    in_array严格模式和普通模式的区别
    thinkphp解决表单令牌问题
    php操作Memcache示例
    flash引入
    自己制作简单的可编辑并添加表情的文本编辑器
    php中mysqli 处理查询结果集的几个方法
  • 原文地址:https://www.cnblogs.com/zhengxingpeng/p/6686304.html
Copyright © 2020-2023  润新知