zoukankan      html  css  js  c++  java
  • 23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade

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

     

     

  • 相关阅读:
    关于SQL Server将一列的多行内容拼接成一行的问题讨论
    Win7 disk.sys无法加载的问题
    mvel2.0语法指南
    让网页不被缓存的解决办法
    让html页面不缓存js的实现方法
    mysql中间件研究(tddl atlas cobar sharding-jdbc)
    jdk环境变量设置理解
    the import cannot be resolved
    Oracle解除表锁定问题
    windows系统中软件开发常用的软件
  • 原文地址:https://www.cnblogs.com/icmzn/p/5697449.html
Copyright © 2011-2022 走看看