2016-07-22
(www.cnblogs.com/icmzn)
模式理解
1. 门面模式 facade ,又称为外观模式
要求所有外部与一个子系统的所有通信必须通过一个“统一的对象”进行。这个对象就是子系统的“门面”,即门面提供一个统一的调用接口,使得
子系统能够简单使用。
门面模式注重“统一的对象”,除了这个统一的对象外,不允许以其他方式调用子系统的行为发生。子系统可以是一个类对象或者一组对象的集合,更直观的
讲不管子系统内是多么杂乱无章,只要“统一对象”是简约整洁即可,即“金玉其外败絮其中”的效果。
一般两个角色:
(1)Facade门面对象
该角色没有实际的业务逻辑,只是一个委托类。一定注意,门面方法不参与业务逻辑,否则就产生一个倒依赖的问题,子系统必须依赖门面才能被访问。
这违反了接口的单一原则。在系统中,门面模式应该是稳定的,不应该经常发生变化,应该发所有可能发生变化的操作封装在子类中完成,无论怎样,
从外部来看就是一个单纯的门面。
(2)Subsystem 子系统对象的集合
2. Facade 模式优点
3. Facade 实用场景
一个系统比较复杂时,可以通过门面模式实现一个很好的封装。如果算法或者业务比较复杂时,可以封装一个多个门面出来,结构简单并且扩展性好。
4. Facade 讨论与扩展
程序实现(C++)
Fecade.h
1 #pragma once 2 #include <iostream> 3 using namespace std; 4 5 class CSubSysA 6 { 7 public: 8 void doMethiodA() 9 { 10 cout << "A系统的调用" << endl; 11 } 12 }; 13 14 class CSubSysB 15 { 16 public: 17 void doMethiodB() 18 { 19 cout << "B系统的调用" << endl; 20 } 21 }; 22 23 //为了不门面对象不参与具体的业务逻辑,将子系统进行一层的封装,提供统一的接口 24 class CSubSysC 25 { 26 public: 27 CSubSysC(CSubSysA* pA, CSubSysB* pB) :m_pSubA(pA), m_pSubB(pB){}; 28 //不管理成员指针指向对象 29 ~CSubSysC() 30 { 31 32 } 33 34 public: 35 void doMethiodAB() 36 { 37 m_pSubA->doMethiodA(); 38 m_pSubB->doMethiodB(); 39 } 40 private: 41 CSubSysA* m_pSubA; 42 CSubSysB* m_pSubB; 43 }; 44 class CFacadeDef 45 { 46 public: 47 CFacadeDef(); 48 ~CFacadeDef(); 49 }; 50 51 class CFacade 52 { 53 public: 54 CFacade() 55 { 56 m_pSubA = new CSubSysA(); 57 m_pSubB = new CSubSysB(); 58 m_pSubC = new CSubSysC(m_pSubA, m_pSubB); 59 } 60 ~CFacade() 61 { 62 delete m_pSubA; 63 delete m_pSubB; 64 delete m_pSubC; 65 } 66 public: 67 //统一模板类接口对象 68 void doMethiodA() 69 { 70 m_pSubA->doMethiodA(); 71 } 72 void doMethiodB() 73 { 74 m_pSubB->doMethiodB(); 75 } 76 //这样处理是为了不使模板类参与具体的业务对象 77 void doMethiodAC() 78 { 79 m_pSubC->doMethiodAB(); 80 } 81 82 private: 83 CSubSysA* m_pSubA; 84 CSubSysB* m_pSubB; 85 CSubSysC* m_pSubC; 86 };
(1)模板应用
main.cpp
1 // Facade.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include "FacadeDef.h" 6 7 int _tmain(int argc, _TCHAR* argv[]) 8 { 9 CFacade* pFacade = new CFacade(); 10 pFacade->doMethiodA(); 11 pFacade->doMethiodB(); 12 pFacade->doMethiodAC(); 13 delete pFacade; 14 system("pause"); 15 return 0; 16 }
(2)输出展示
时间: 2024-10-07 23:26:36