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();





  • 相关阅读:
    剑指Offer-11.二进制中1的个数(C++/Java)
    剑指Offer-10.矩形覆盖(C++/Java)
    剑指Offer-9.变态跳台阶(C++/Java)
    UVA 1608 Non-boring sequence 不无聊的序列(分治,中途相遇)
    UVA1607 Gates 与非门电路 (二分)
    UVA 1451 Average平均值 (数形结合,斜率优化)
    UVA 1471 Defense Lines 防线 (LIS变形)
    UVA 1606 Amphiphilic Carbon Molecules 两亲性分子 (极角排序或叉积,扫描法)
    UVA 11134 FabledRooks 传说中的车 (问题分解)
    UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)
  • 原文地址:https://www.cnblogs.com/RealOnlyme/p/2395579.html
Copyright © 2011-2022 走看看