码迷,mamicode.com
首页 > 编程语言 > 详细

23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade

时间:2016-07-22 23:02:39      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade

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)输出展示

技术分享 

 

23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade

标签:

原文地址:http://www.cnblogs.com/icmzn/p/5697449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!