/************************************************************************ * 外观模式学习笔记[C++] * Author: 陈相礼 * Time: 2009.12.04 * Compiler: VC8 ************************************************************************/ #include "FacadePattern.h" #include "FacadePattern1.h" #include "FacadePattern2.h" #include <iostream> #include <string> using namespace std; void main( void ) { //------------------外观模式原理类测试------------------- CFacade *pfacade = new CFacade(); pfacade->vMethodA(); pfacade->vMethodB(); delete(pfacade); //------------------股民炒股之外观模式类测试------------------- CStock1 *gu1 = new CStock1(); CStock2 *gu2 = new CStock2(); CStock3 *gu3 = new CStock3(); CNationalDebt1 *nd = new CNationalDebt1(); CRealty1 *rl = new CRealty1(); // 买入 gu1->vBuy(); gu2->vBuy(); gu3->vBuy(); nd->vBuy(); rl->vBuy(); // 抛出 gu1->vSell(); gu2->vSell(); gu3->vSell(); nd->vSell(); rl->vSell(); delete(gu1); delete(gu2); delete(gu3); delete(nd); delete(rl); //------------------投资基金之外观模式类测试------------------- CFund *jijin = new CFund(); // 基金购买 jijin->vBuyFund(); // 基金赎回 jijin->vSellFund(); delete(jijin); } /************************************************************************ * 小结:[使用外观模式情形] * 首先,在设计初期阶段,应该要有意识的将不同的两个层分离,层与 * 层之间建立外观Facade,通过提供简单接口的方式以降低耦合度。 * 其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复 * 杂,增加外观Facade可以提供一个简单的借口,减少它们之间的依赖。 * 第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维 * 护和扩展了,可为新系统开发一个外观Facade类,来提供设计粗糙或高 * 度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互, * Facade与遗留代码交互所有复杂的工作。 ************************************************************************/ #pragma once /********************************************** * 外观模式原理: * 为子系统中的一组接口提供一个一致的界面, * 此模式定义了一个高层接口,这个借口使得这 * 一子系统更加容易使用。 ***********************************************/ #include <iostream> #include <string> using namespace std; //--------------------------------------------- // 子系统类 // 实现子系统的功能,处理CFacade对象指 // 派的任务。注意子类中没有CFacade的任何信 // 息,即没有对CFacade的对象引用。 class CSubsystem1 { public: void vMethod1() { cout << "子系统方法1" << endl; } protected: private: }; class CSubsystem2 { public: void vMethod2() { cout << "子系统方法2" << endl; } protected: private: }; class CSubsystem3 { public: void vMethod3() { cout << "子系统方法3" << endl; } protected: private: }; class CSubsystem4 { public: void vMethod4() { cout << "子系统方法4" << endl; } protected: private: }; //--------------------------------------------- // 外观类 // 需要了解子系统的方法或属性,进行组 // 合,以备外界调用。 // 知道哪些子类负责处理请求,将客户的 // 请求代理给适当的子系统对象。 class CFacade { public: // 构造,初始化子类信息 CFacade() { mp_sub1 = new CSubsystem1(); mp_sub2 = new CSubsystem2(); mp_sub3 = new CSubsystem3(); mp_sub4 = new CSubsystem4(); } // 析构 ~CFacade() { if ( NULL != mp_sub1 ) { delete(mp_sub1); } if ( NULL != mp_sub2 ) { delete(mp_sub2); } if ( NULL != mp_sub3 ) { delete(mp_sub3); } if ( NULL != mp_sub4 ) { delete(mp_sub4); } } // 对子类进行方法组合 void vMethodA() { cout << "/n方法组A():" << endl; mp_sub1->vMethod1(); mp_sub2->vMethod2(); mp_sub4->vMethod4(); } void vMethodB() { cout << "/n方法组B():" << endl; mp_sub2->vMethod2(); mp_sub3->vMethod3(); mp_sub4->vMethod4(); } protected: private: CSubsystem1 *mp_sub1; CSubsystem2 *mp_sub2; CSubsystem3 *mp_sub3; CSubsystem4 *mp_sub4; }; #pragma once /********************************************** * * 外观模式应用:股民炒股 * ***********************************************/ #include <iostream> using namespace std; // 股票1 class CStock1 { public: // 卖股票 void vSell() { cout << "股票1卖出" << endl; } // 买股票 void vBuy() { cout << "股票1买入" << endl; } protected: private: }; // 股票2 class CStock2 { public: // 卖股票 void vSell() { cout << "股票2卖出" << endl; } // 买股票 void vBuy() { cout << "股票2买入" << endl; } protected: private: }; // 股票3 class CStock3 { public: // 卖股票 void vSell() { cout << "股票3卖出" << endl; } // 买股票 void vBuy() { cout << "股票3买入" << endl; } protected: private: }; // 国债1 class CNationalDebt1 { public: // 卖国债 void vSell() { cout << "国债1卖出" << endl; } // 买国债 void vBuy() { cout << "国债1买入" << endl; } protected: private: }; // 房地产1 class CRealty1 { public: // 卖房产 void vSell() { cout << "房产1卖出" << endl; } // 买房产 void vBuy() { cout << "房产1买入" << endl; } protected: private: }; #pragma once /********************************************** * * 外观模式应用:投资基金 * ***********************************************/ #include <iostream> using namespace std; // 前置声明 class CStock1; class CStock2; class CStock3; class CNationalDebt1; class CRealty1; // 基金类 class CFund { public: // 构造 CFund() { mp_gu1 = new CStock1(); mp_gu2 = new CStock2(); mp_gu3 = new CStock3(); mp_nd = new CNationalDebt1(); mp_rl = new CRealty1(); } // 析构 ~CFund() { if ( NULL != mp_gu1 ) { delete(mp_gu1); } if ( NULL != mp_gu2 ) { delete(mp_gu2); } if ( NULL != mp_gu3 ) { delete(mp_gu3); } if ( NULL != mp_nd ) { delete(mp_nd); } if ( NULL != mp_rl ) { delete(mp_rl); } } // 买入 void vBuyFund() { mp_gu1->vBuy(); mp_gu2->vBuy(); mp_gu3->vBuy(); mp_nd->vBuy(); mp_rl->vBuy(); } // 抛出 void vSellFund() { mp_gu1->vSell(); mp_gu2->vSell(); mp_gu3->vSell(); mp_nd->vSell(); mp_rl->vSell(); } protected: private: CStock1 *mp_gu1; CStock2 *mp_gu2; CStock3 *mp_gu3; CNationalDebt1 *mp_nd; CRealty1 *mp_rl; };