zoukankan      html  css  js  c++  java
  • 桥接模式(Bridge)

    桥接模式(Bridge

     

    桥接模式(Bridge[Handle/Body]

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

    应用:不同系统平台的Windows界面。

    模式结构

     

    心得

    用户所见类体系结构(Window派生)提供了一系列用户的高层操作的接口,但是这些接口的实现是基于具体的底层实现的(WindowImp)。我们不应该为不同的实现提供单独的代码,而应该将这些实现上的区别封装起来。WindowImp提供了合适数量和粒度的底层抽象,而实现这些接口的工作由具体的子类来做。这些底层抽象接口通过组合耦合的方式被高层类体系调用,而这一切对用户是透明的。高层类Window及其子类只需要使用WindowImp提供好的接口来实现自己的功能就可以了,当需要进行实现平台的移植的时候只需要更换具体的实现类就可以了,而不会对用户的代码有任何影响。使用桥模式将用户的所见的抽象接口与接口的具体实现分离,而且抽象接口和实现部分是完全独立变化的。该类问题和抽象工厂有点类似,但是不能使用抽象工厂。因为抽象工厂需要产品拥有一致的接口和继承层次,而这些条件在不同的平台上肯定是无法满足的。

    举例

    就上述列举的Window的实现问题,我们把实现的C++代码和用户操作代码列举如下:

     
    //底层实现部分
    class WindowImp
    {
    public:
        virtual void devDrawText()=0;
        virtual void devDrawLine()=0;
        virtual ~WindowImp(){}
    };
    class XWindowImp:public WindowImp
    {
    public:
        virtual void devDrawText()
        {
            cout<<"XWindow--Text"<<endl;
        }
        virtual void devDrawLine()
        {
            cout<<"XWindow--Line"<<endl;
        }
    };
    class PMWindowImp:public WindowImp
    {
    public:
        virtual void devDrawText()
        {
            cout<<"PMWindow--Text"<<endl;
        }
        virtual void devDrawLine()
        {
            cout<<"PMWindow--Line"<<endl;
        }
    };
    //高层抽象部分
    class Window
    {
        WindowImp*imp;//底层实现
    public:
        Window(WindowImp*i):imp(i){}
        virtual void drawText()
        {
            imp->devDrawText();
        }
        virtual void drawRect()
        {
            imp->devDrawLine();
            imp->devDrawLine();
            imp->devDrawLine();
            imp->devDrawLine();
        }
        virtual ~Window()
        {
            delete imp;
        }
    };
    class IconWindow:public Window
    {
    public:
        IconWindow(WindowImp*i):Window(i){}
        virtual void drawBoard()
        {
            drawRect();
            drawText();
        }
    };
    class TrasientWindow:public Window
    {
    public:
        TrasientWindow(WindowImp*i):Window(i){}
        virtual void drawCloseBox()
        {
            drawRect();
        }
    };
    WindowImp*imp=new XWindowImp();
    Window w(imp);
    w.drawText();
    w.drawRect();
    imp=new PMWindowImp();
    IconWindow iw(imp);
    iw.drawBoard();
     

    至于imp的构造时机可以通过工厂方法根据不同的平台来构造,用户不需要知道系统构造了什么样的imp对象,至于工厂方法类又可以使用单例模式来实现,这样系统的差别全部被封装在一个单独的对象内。用户代码对Window的操作不受平台的任何约束。

    来源:http://www.cnblogs.com/fanzhidongyzby/archive/2012/12/14/2818793.html

  • 相关阅读:
    【Demo】QQ,github,微博第三方社交登录
    crontab执行时间和系统时间不一致
    CDN服务技术架构图
    【php】命名空间 和 自动加载的关系
    【运维工具】Git代码发布系统
    【ipv6惹的祸】curl 超时
    MySQL:动态开启慢查询日志(Slow Query Log)
    Virtualbox 虚拟机支持硬件摄像头
    网页取消快照、禁止抓取等meta标签功能
    ajax 跨域
  • 原文地址:https://www.cnblogs.com/94julia/p/3092209.html
Copyright © 2011-2022 走看看