zoukankan      html  css  js  c++  java
  • 设计模式8——结构型模式之桥接模式

    定义:桥接模式(BridgePattern),将抽象部分与它的实现部分分离,使它们都可以独立地变化。

    类型:结构型模式。

    类图:

    参与角色:

    1. Clinet,客户指定组装电脑,指定了最初的接口。
    1. Computer,电脑抽象类,指定了具体安装CPU的接口。
    1. DesktopComputer,具体的台式机电脑,根据主板型号具体实现如何安装CPU
    2. CPU,抽象类,指定连接CPU针脚的接口。
    1. PentiumCore,具体的CPU,具体实现如何连续CPU的针脚。

    概述:

            CPU每年都在更新,尤其是像PentiumCore这样两代产品架构的更新,直接导致整个电脑产业链的更新。例如,PentiumCore架构下的CPU针脚数不一样,这就要求匹配的主板也必须与CPU吻合。另外核心显卡也集成到了CPU当中云,这些都会影响到电脑的组装。

            为了保证达到开闭原则,尽量不去修改原有代码,那么针对产品的升级,就必须通过继承来实现。但是电脑产品的升级会涉及到很多部件。如CPU升级了,就要派生一个新的类了。如果主板升级了,也要派生一个新的类。如果声卡升级了,也需要派生一个新的类。或者其中两个部件升级了,也需要派生新的电脑类。随着变化的部件越来越多,可能会产生非常多非常多的派生类,不便于管理。这个时候就需要用到桥接模式。

           桥接模式,将每一个维度的变化都独立出来,并且做成抽象类,通过派生来实现单个维度的升级改变。这样,在客户看来,具体的产品组装接口是没有变,不影响客户端的使用。

           这里的示例,主要是以CPU以及安装CPU这两个维度作一下模拟。

    代码示例:

     
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
     
    class CCPU
    {
    public:
        virtual ~CCPU(){}
        virtual void Connect() = 0;
    };
     
    class CComputer
    {
    public:
        CComputer(CCPU* _pCPU) : m_pCPU(_pCPU){}
        virtual ~CComputer(){}
        virtual void ConnectCPU() = 0;
    protected:
        CCPU* m_pCPU;
    };
     
    class CDesttopComputer : public CComputer
    {
    public:
        CDesttopComputer(CCPU* _pCPU) : CComputer(_pCPU){}
        virtual void ConnectCPU()
        {
            cout<<"CPU"<<endl;
            m_pCPU->Connect();
     
        }
    };
     
    class CPentiun : public CCPU
    {
    public:
        virtual void Connect()
        {
            cout<<"CPU"<<endl;
        }
    };
     
    class CCore : public CCPU
    {
    public:
        virtual void Connect()
        {
            cout<<"CPU"<<endl;
        }
    };
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        // 
        CCPU* pCPU = new CPentiun();
        CComputer* pComputer = new CDesttopComputer(pCPU);
        pComputer->ConnectCPU();
        delete pCPU;
        delete pComputer;
     
        // 
        pCPU = new CCore();
        pComputer = new CDesttopComputer(pCPU);
        pComputer->ConnectCPU();
        delete pCPU;
        delete pComputer;
     
        return 0;
    }
     
     
    注意: 抽象类的析构函数一定要设定为虚函数,否则在内存释放的时候可能会有问题

    优缺点:

    1. 优点,将实现与抽象分离,具有更好的可扩展性。并且通过组合的方式可以大大提高代码的灵活性。
    2. 缺点,前期较好的识别出可变的维度有一定的困难。

    参考资料:

    1. 《设计模式——可复用面向对象软件基础》
    2. Java与模式》
    3. 《大话设计模式》
  • 相关阅读:
    建设全功能团队
    gwt之mvc4g
    SQLServer代码差异备份
    DateTimePicker选择到秒
    SQL定时备份并删除过期备份
    Div文本垂直居中
    WinForm当前窗口抓图
    web架构设计经验分享(转)
    用yui compressor 压缩 javascirpt脚本
    查看sqlserver连接数
  • 原文地址:https://www.cnblogs.com/feihe0755/p/3516790.html
Copyright © 2011-2022 走看看