• Bridge模式


    Bridge模式可以更方便的扩展,实现了类的实现与定义的完全分离。实现方式为:通过定义两个类,一个类来定义功能,另一个类来实现功能,实现功能的类的对象以参数形式赋给定义功能的类,从而实现信息相互配合使用。

    本想在此处插入Bridge模式的UML图示,插入太麻烦,过几天修改插入!

    下面是Bridge模式的一个实现例子:

       /// 抽象类定义

    // window.h: interface for the window class.
    //
    //////////////////////////////////////////////////////////////////////

    #if !defined(AFX_WINDOW_H__879AA6CF_45FB_4EDD_BFF2_47275044D496__INCLUDED_)
    #define AFX_WINDOW_H__879AA6CF_45FB_4EDD_BFF2_47275044D496__INCLUDED_

    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000

    class window  
    {
    public:
        
    virtual void DrawRect(voidconst = 0;
        
    virtual void DrawText(voidconst = 0;
        window();
        
    virtual ~window();
    }
    ;

    #endif // !defined(AFX_WINDOW_H__879AA6CF_45FB_4EDD_BFF2_47275044D496__INCLUDED_)

    /// 抽象类的类实现

    // windowImp.h: interface for the windowImp class.
    //
    //////////////////////////////////////////////////////////////////////

    #if !defined(AFX_WINDOWIMP_H__D9031704_B384_45AC_BA53_89CC82FE50FB__INCLUDED_)
    #define AFX_WINDOWIMP_H__D9031704_B384_45AC_BA53_89CC82FE50FB__INCLUDED_

    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000

    // 为window类的实现,由于window类是abstract class,所以,windowImp 也为
    // abstract class
    // window 和windowImp之间的关系为Bridge关系
    class windowImp  
    {
    public:
        
    virtual void DrawRectImp(voidconst = 0;
        
    virtual void DrawTextImp(voidconst =0;
        windowImp();
        
    virtual ~windowImp();

    }
    ;

    #endif // !defined(AFX_WINDOWIMP_H__D9031704_B384_45AC_BA53_89CC82FE50FB__INCLUDED_)

    从设计耦合的角度讲,在window类的初始化时就把windwoImp类粘贴进去,那是更为不错的设计,但是,这么设计,将会导致派生类中运用windowImp成为一个较为麻烦的事情,那样设计可以通过两种方式来管理内部数据:
    1、将基类中的windowImp实例作为protected类型
    2、把windowImp实例作为private类型,在基类中定义一个虚拟函数,用来获取windowImp实例,这种方式更加灵活一些

    此处为求简便,未在window类的构造函数中载入windowImp的实例

    ///派生抽象类的定义,成为具体的类定义IconWindow

    // IconWindow.h: interface for the IconWindow class.
    //
    //////////////////////////////////////////////////////////////////////

    #if !defined(AFX_ICONWINDOW_H__721CA32A_45BD_49B3_A72B_83D5987D96A5__INCLUDED_)
    #define AFX_ICONWINDOW_H__721CA32A_45BD_49B3_A72B_83D5987D96A5__INCLUDED_

    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000

    #include 
    "window.h"
    #include 
    "windowImp.h"

    class IconWindow : public window  
    {
    public:
        
    virtual void DrawRect(voidconst;
        
    virtual void DrawText(voidconst;
        IconWindow(windowImp
    & wndImp);
        
    virtual ~IconWindow();

    private:
        windowImp
    & m_wndImp;
    }
    ;

    #endif // !defined(AFX_ICONWINDOW_H__721CA32A_45BD_49B3_A72B_83D5987D96A5__INCLUDED_)

    在派生类的构造函数中载入了windowImp的实例(引用方式载入)

    /// 下面是 IconWindow 的实现

    // IconWindow.cpp: implementation of the IconWindow class.
    //
    //////////////////////////////////////////////////////////////////////

    #include 
    "IconWindow.h"

    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////

    IconWindow::IconWindow(windowImp
    & wndImp)
    : m_wndImp(wndImp)
    {

    }


    IconWindow::
    ~IconWindow()
    {

    }


    void IconWindow::DrawText() const
    {
        m_wndImp.DrawTextImp();   //通过windowImp来实现其功能
    }


    void IconWindow::DrawRect() const
    {
        m_wndImp.DrawRectImp();   //通过windowImp来实现其功能

    }

    /// 下面是XWindow系统下的windowImp实现,首先进行类定义

    // XWindowImp.h: interface for the XWindowImp class.
    //
    //////////////////////////////////////////////////////////////////////

    #if !defined(AFX_XWINDOWIMP_H__5CC6D589_DDA4_4CBC_B2C0_60A79AB64962__INCLUDED_)
    #define AFX_XWINDOWIMP_H__5CC6D589_DDA4_4CBC_B2C0_60A79AB64962__INCLUDED_

    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000

    #include 
    "windowImp.h"

    class XWindowImp : public windowImp  
    {
    public:
        
    virtual void DrawTextImp(voidconst;
        
    virtual void DrawRectImp(voidconst;
        XWindowImp();
        
    virtual ~XWindowImp();

    }
    ;

    #endif // !defined(AFX_XWINDOWIMP_H__5CC6D589_DDA4_4CBC_B2C0_60A79AB64962__INCLUDED_)

    /// 然后是XWindowImp的实现

    // XWindowImp.cpp: implementation of the XWindowImp class.
    //
    //////////////////////////////////////////////////////////////////////

    #include 
    "XWindowImp.h"
    #include 
    <iostream>
    using namespace std;

    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////

    XWindowImp::XWindowImp()
    {
        cout
    <<"In XWindowImp class"<<endl;
    }


    XWindowImp::
    ~XWindowImp()
    {
        cout
    <<"quit XWindowImp class"<<endl;
    }


    void XWindowImp::DrawRectImp() const
    {
        cout
    <<"XWindowImp::DrawRectImp"<<endl;
    }


    void XWindowImp::DrawTextImp() const
    {
        cout
    <<"XWindowImp::DrawTextImp"<<endl;
    }

    为求简便,此处仅就实现这两个类的派生,下面进行测试:

    #include "IconWindow.h"
    #include 
    "TranslentWindow.h"
    #include 
    "PMWindowImp.h"
    #include 
    "XWindowImp.h"
    #include 
    <iostream>
    using namespace std;

    void test(void)
    {
        
    // 测试XWindowImp中的性能,由于一般情况下,不同平台上不可能同时运行,
        
    // 因此IconWindow以及TranslentWindow均需要重新定义
        XWindowImp xWndImp;
        IconWindow xIconWnd(xWndImp);
        xIconWnd.DrawText();
        xIconWnd.DrawRect();
    //          在我的机器上,还有派生自window的TranslentWindow 的类定义与实现,也是通过调用
    //          windowImp类引用的对象实现的。
    //    TranslentWindow xTransWnd(xWndImp);
    //    xTransWnd.DrawText();
    //    xTransWnd.DrawRect();
        cout<<endl<<endl;

    }


    int main(void)
    {
        test();
        
    return 0;
    }

    小结:

           此处window类派生了IconWindow类,windowImp类派生了XWindowImp类。windowImp类是window类的实现,从两个派生类中接口函数的实现代码中可以看出,这也就是说window类是通过windowImp来实现,window类自己并没有实现接口功能的,而是通过windowImp类实现接口功能,这与单独一个类的申明与定义是类似的,因此window类可以作为类实现功能的申明,而windowImp类作为类实现功能的定义,这样就满足了接口与实现的完全分离,结合Decroator模式,window类的实现将会非常丰富,类与类之间的耦合程度也非常小,只有一个构造函数的耦合,同时也非常容易扩充,仅需要通过派生window类和windowImp类就可以实现新的window类功能与新的平台功能(此处)。

    /*
    *
    * Copyright (c) 2011 Ubunoon.
    * All rights reserved.
    *
    * email: netubu#gmail.com replace '#' to '@'
    * http://www.cnblogs.com/ubunoon
    * 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
    * 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */
  • 相关阅读:
    架构师最怕程序员知道的10件事
    利用php制作简单的文本式留言板
    Jmeter之查看结果树
    Jmeter之循环控制器
    Jmeter之HTTP常用配置元件(默认、头信息和cookies)
    Jmeter之线程组(Stepping和Ultimate)
    Jmeter之插件安装
    Jmeter之线程组(默认)
    Jmeter之测试计划
    Jmeter之安装和配置
  • 原文地址:https://www.cnblogs.com/ubunoon/p/2058916.html
Copyright © 2020-2023  润新知