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

    之前写博一直在csdn,但是上面的服务器时好时坏,发文会丢。发现这边园子还不错,因此转到这里来了。第一篇就介绍一下我对Bridge的理解。

    UML工具使用Enterprise Architect, 工程使用VC2008编译通过。

    先贴出类的关系:

    class CProductA继承自class Bridge, 具备其属性pIfc, 该属性是指向CIfOperator(接口)的指针. C++不存在真正意义上的接口, 只是一个纯虚类;

                           具备GetImp()操作方法用以获得通过接口传过来的实例;

                           重写(覆盖,override)Attribute().

     

    class Bridge聚合了接口CIfOperator.

    class COperatorAclass COperatorB实现了接口, 并各自重写了Operator()方法, 使其各自具备自身特点。

    这样,class CProductA和class COperatorA, class COperatorB等之间形成了Bridge.

    每次给CProductA增加新的实现方法, 只需要新增加一个实现接口CIfOperator的实例并通过GetImp()传入给CProduceA,以此实现操作者和操作方法分离。

    代码实现:

    View Code
    //Bridge.h
    #ifndef _BRIDGE_H__
    #define _BRIDGE_H__

    /*接口,抽象类实现*/
    class CIfOperator
    {
    public:
    virtual void Operator()=0;
    };

    /*抽象, 非抽象类*/
    class CAbstract
    {
    protected:
    //聚合操作接口的实例
    CIfOperator* pIfc;
    public:
    /*非纯虚函数必须要定义,否则即使其子类也不能实例化成功*/
    virtual void Attribute()
    {
    }
    //获取操作接口的接口函数
    CIfOperator* GetImp(CIfOperator* p);
    };

    //操作者
    class CProductA:public CAbstract
    {
    public:
    virtual void Attribute();
    };

    /*操作实现1*/
    class COperatorA:public CIfOperator
    {
    /* public:*//*接口,可以不用public属性*/
    virtual void Operator();
    };

    /*操作实现2*/
    class COperatorB:public CIfOperator
    {
    /*public:*/
    virtual void Operator();
    };
    #endif/*_BRIDGE_H__*/
    View Code
    //Bridge.hcpp
    #include "Bridge.h"

    #include <stdio.h>

    void CProductA::Attribute()
    {
    pIfc->Operator();
    }

    CIfOperator* CAbstract::GetImp(CIfOperator* p)
    {
    pIfc = p;
    return p;
    }


    //具体方法实现
    void COperatorA::Operator()
    {
    printf("COperatorA.Operator\n");
    }

    void COperatorB::Operator()
    {
    printf("COperatorB.Operator\n");
    }
    View Code
        CProductA pA;
    pA.GetImp(new COperatorA());
    pA.Attribute();
    pA.GetImp(new COperatorB());
    pA.Attribute();





  • 相关阅读:
    python数据分析实例(1)
    Latex学习(1): longtable的分页显示保留表头与标题L
    pl/sql学习(5): 触发器trigger/事务和锁
    pl/sql学习(6): 引号/程序调试/列中的字符串合并/正则表达式
    pl/sql学习(4): 包package
    SQL入门(4): 嵌入式SQL语言
    我觉得vue原理就是 Object.defineProperty,简单实现了set和get,谢谢
    vue组件一
    css3 flex盒子布局
    php连接数据库、创建数据库、创建数据表
  • 原文地址:https://www.cnblogs.com/RealOnlyme/p/2395579.html
Copyright © 2011-2022 走看看