zoukankan      html  css  js  c++  java
  • 【设计模式】外观模式

    /************************************************************************
    设计模式
    外观模式
    
    外观模式:有若干子系统,这些子系统提供提供了若干功能,如果要完成某个操作,
    需要由各个子系统的全部或若干功能组成,那就需要类似的代码:
    
    class Subsystem1
    {
        void function1_1();
        void function1_2();
    }
    
    class Subsystem2
    {
        void function2_1();
        void function2_2();
    }
    
    calss Subsystem3
    {
        void function3_1();
        void functoin3_2();
    }
    
    要完成一个操作Operate1,需要如下:
    
        操作1:Operate1  
        function1_1();
        function3_2();
     
    
    等等, 所以当有若干个操作和若干个排列组合时,就需要在客户度写多次,当有
    子系统扩展和函数名更改时,就需要在每次用到的地方全部更改;这样耦合度极高,
    这时就可以使用【外观模式】
    
    外观模式提供了一系列接口,在这些接口内部对各个子系统的功能进行了排列组合的
    调用,客户端在使用时直接使用外观模式提供的接口接口,客户端并不知道外观模式
    内部封装了哪些操作,各个子系统也不知道外观类的存在,外观类需要了解各个子系统
    的很多细节。
    
    感觉外观模式和代理模式有点像呢?
    ************************************************************************/
    
    
    /************************************************************************
    这里我们以这样一个例子来说明,这也是【大话设计模式】里小菜和大鸟提到的
    例子
    
    客户通过基金公司购买基金,基金公司通过专业的操作,包括投资股票等投资项目
    完成升值,为客户赚钱,基金公司赚取管理费。
    这里的基金公司就是一个外观类,其赚钱的手段封装了很多细节的操作,对客户
    来说,他只通过基金公司打交道来来购买 / 赎回自己的钱。
    
    ************************************************************************/

    三个类,【股票】类 和 【投资】类相当于两个基金组织可以操作的两个子系统,【基金】类相当于【外观】,其内部的收入(Shouru()) 和 支出(Zhichu())操作封装了【股票】类和【投资】类的操作。

    客户并不知道基金组织怎么用钱,对客户来说只有【基金】类提供给他的收入和之处接口。

    【股票】类 和 【外观】类也并不知道有【基金】类的存在。

    //【股票】类
    class CStock
    {
    public:
        CStock();
        virtual ~CStock();
        void Buy();   //
        void Sell();  //
    };
    
    CStock::CStock(){cout << "进入股票市场"<<endl;}
    CStock::~CStock(){}
    void CStock::Buy(){cout << "买入股票"<<endl;}
    void CStock::Sell(){cout << "卖出股票"<<endl;}
    
    
    //【投资】类
    class CInvest
    {
    public: 
        CInvest();
        virtual ~CInvest();
        void Invest();    //投资
        void Benifite();  //获利 
    };
    
    CInvest::CInvest(){cout << "进行资本市场"<<endl;}
    CInvest::~CInvest(){}
    void CInvest::Invest(){cout << "进行投资"<<endl;}
    void CInvest::Benifite(){cout<< "投资获利"<<endl;}
    
    
    
    //【基金】类,即外观类
    class CFund 
    {
    public:
        CFund();
        virtual ~CFund();
        void Zhichu();
        void Shouru();
    
    CStock* m_ptrStock;
    CInvest* m_ptrInvest;
    };
    
    CFund::CFund()
    {
        cout<<"基金组织开始运作:"<<endl; 
        m_ptrStock = new CStock();
        m_ptrInvest = new CInvest();
        cout << endl;
    }
    
    
    CFund::~CFund(){}
    void CFund::Zhichu()
    {    
        cout << "支出操作:"<<endl;
        m_ptrStock->Buy();
        m_ptrInvest->Invest();
        cout<<endl<<endl;
    }
    void CFund::Shouru()
    {
        cout << "收入操作:"<<endl; 
        m_ptrStock->Sell();
        m_ptrInvest->Benifite();
        cout<<endl;
    }

    客户端代码

    int _tmain(int argc, _TCHAR* argv[])
    {
        CFund* pFunc = new CFund();
        pFunc->Zhichu();
        pFunc->Shouru();
    
    
        return 0;
    }

    执行结果:

     

  • 相关阅读:
    Module build failed: Error: Cannot find module 'node-sass'报错问题
    vue element upload
    vue-element-table 分页选中
    两种倒计时
    【LOJ #6076】「2017 山东一轮集训 Day6」三元组(莫比乌斯反演 / 三元环计数)
    【LOJ #6075】「2017 山东一轮集训 Day6」重建(DP)
    【2020省选模拟】题解
    【LOJ #6074】「2017 山东一轮集训 Day6」子序列(矩阵乘法)
    【LOJ #6073】「2017 山东一轮集训 Day5」距离(主席树 / 树链剖分)
    【LOJ #6072】 「2017 山东一轮集训 Day5」苹果树(容斥 / 搜索 / 矩阵树定理)
  • 原文地址:https://www.cnblogs.com/cuish/p/3764936.html
Copyright © 2011-2022 走看看