//---------------------------15/04/16----------------------------

//Facade 外观模式-----对象结构型模式

/*

1:意图:

为子系统的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得

这一子系统更加容易使用。

2:动机:

3:适用性:

1>当你要为一个复杂子系统提供一个简单接口时。

子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。

这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子

系统的用户带来使用上的困难。Facade可以提供一些简单的接口,这些接口对大多数

用户来说是够用的,而那些需要更多可定制性的用户可以不管facade层,直接使用原来的子系统。

2>客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade将这个子系统与客户以及

其他的子系统分离,可以提高子系统的独立性和可移植性。

3>当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点,如果子系统

之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。

4:结构:

并不能画,图在设计模式书上130页。

5:参与者:

1>Facade:

1)知道哪些子系统负责处理请求。

2)将客户的请求代理给适当的子系统对象。

2>Subsystem classes:

1)实现子系统的功能。

2)处理由Facade对象指派的任务。

3)没有facade的任何相关信息;即没有指向facade的指针。

6:协作:

1>客户程序通过发送请求给Facade的方式与子系统通讯,Facade将这些消息转发给适当的子系统

对象。尽管是子系统中的有关对象在做实际工作,但是Facade模式本身也必须将它的接口转换

成子系统的接口(接口设计得和子系统一样)。

2>使用Facade的客户程序不需要直接访问子系统对象。

7:效果:

1>它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。

2>它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合

关系使得子系统的组件变化不会影响到客户。Facade模式有助于建立层次结构系统,也有助于

对对象之间的依赖关系分层。Facade模式可以消除复杂的循环依赖关系。

用Facade可以降低编译依赖性。

3>如果应用需要,它并不限制它们使用子系统类。因此可以在易用性和通用性之间加以选择。

8:实现:

1>降低客户-子系统之间的耦合度。

1)用抽象类实现Facade而它的具体子类对应不同的子系统实现,这可以进一步降低客户与子系统

之间的耦合度。

2)用不同的子系统对象配置Facade对象。为它定制facade,仅需对它的子系统对象进行替换

即可。

2>公共子系统类与私有子系统类。一个子系统与一个类的相似之处是:它们都有接口并且它们都封装

了一些东西--类封装了状态和操作,而子系统封装了一些类。所以要考虑子系统的公共和私有接口。

可以通过命名空间的办法仅暴露公告子系统类。

9:代码示例:                                                                     */

//子系统中的类,功能:接受字符流,产生字标识符流。

class Scanner

{

public:

Scanner(istream&);

virtual ~Scanner();

virtual Token& Scan();

private:

istream& _inputStream;

};

//子系统中的类,功能:通过Scanner生成的标识符流,使用ProgramNodeBuilder创建一棵语法分析树

class Parser

{

public:

Parser();

virtual ~Parser();

virtual void Parse(Scanner&, ProgramNodeBuilder&);

};

//子系统中的类,功能:builder模式下的conceretebuilder

class ProgramNodeBuilder

{

public:

virtual ProgramNode* NewVariable(const
char* variableName)
const;

virtual ProgramNode* NewAssignment(ProgramNode* variable,

ProgramNode* expression)
const;

virtual ProgramNode* NewReturnStatment(ProgramNode* value)
const;

virtual ProgramNode* NewCondition(ProgramNode* condition,

ProgramNode* truePart,

ProgramNode* falsePart)
const;

...

ProgramNode* GetRootNode();

private:

ProgramNode* _node;

};

//子系统中的类,功能:builder模式下的abstract product

class ProgramNode

{

public:

virtual void GetSourcePosition(int& line,
int& index);

...

//child manipulation

virtual void Add(ProgramNode*);

virtual void Remove(ProgramNode*);

...

virtual void Traverse(CodeGenerator&);

protected:

ProgramNode();

};

//子系统中的类,功能:这是个接口,通过子类来实现具体的操作:为不同的硬件体系结构生产机器代码

class CodeGenerator

{

public:

virtual void Visit(StatementNode*);

virtual void Visit(ExpressionNode*);

...

protected:

CodeGenerator(BytecodeStream&);

protected:

BytecodeStream& _output;

};

//ExpressionNode子系统中的类,功能:builder模式下的concrete product

//下面是Traverse(函数)的具体实现

void ExpressionNode::Traverse(CodeGenerator* cg)

{

cg.Visit(this);

ListIterator<ProgramNode*> i(_children);

for(i.First(); !i.IsDone(); i.Next())

{

i.CurrentItem()->Traverse(cg);

}

}

//终于结束了!!
上面的类全部属于Subsystem classes

//下面这就是Facade模式中的Facade类了

class Compiler

{

public:

Compiler();

virtual void Compile(istream&, BytecodeStream&);

};

//封装了子系统类中的操作。

void Compiler::Compile(istream& input, BytecodeStream& output)

{

Scanner scanner(input);

ProgramNodeBuilder builder;

Parser parser;

parser.Parse(scanner, builder);

RISCCodeGenerator generator(output);

ProgramNode* parseTree = builder.GetRootNode();

parseTree->Traverse(generator);

}

//这个模式就和使用函数一样,在C中当代码太多函数太多我们就需要使用函数来整理,把功能分类

//这个模式就是把类整理起来,使用这些类整合出必要的接口(功能)

设计模式 笔记 外观模式 Facade的更多相关文章

  1. 乐在其中设计模式(C#) - 外观模式(Facade Pattern)

    原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...

  2. 8.4 GOF设计模式三: 外观模式 Facade

    GOF设计模式三: 外观模式 Facade  “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...

  3. 二十四种设计模式:外观模式(Facade Pattern)

    外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...

  4. [设计模式] 10 外观模式 facade

    外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来.客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构. ...

  5. 设计模式之外观模式(Facade)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 【设计模式】—— 外观模式Facade

    前言:[模式总览]——————————by xingoo 模式意图 外观模式主要是为了为一组接口提供一个一致的界面.从而使得复杂的子系统与用户端分离解耦. 有点类似家庭常用的一键开关,只要按一个键,台 ...

  7. 结构型设计模式之外观模式(Facade)

    结构 意图 为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性 当你要为一个复杂子系统提供一个简单接口时.子系统往往因 ...

  8. python : 设计模式之外观模式(Facade Pattern)

    #为啥要用外观模式举例说明 这个例子很形象,直接从人家博客上贴过来的,参考链接在下面 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶.茶具和开水,如图1(A)所示,而 ...

  9. 【UE4 设计模式】外观模式 Facade Pattern

    概述 描述 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.外观模式又称为门面模式,它是一 ...

随机推荐

  1. nopcommerce

    nopcommerce是国外的一个高质量的开源b2c网站系统,基于EntityFramework4.0和MVC3.0,使用Razor模板引擎,有很强的插件机制,包括支付配送功能都是通过插件来实现的,基 ...

  2. 通过yum源在centOS7安装mysql8

    1.去官网下载rpm文件,该文件专门用于yum安装方式: 到官网https://www.mysql.com/downloads/下载社区版Community(针对个人),如下图: 然后拉到最下面,我下 ...

  3. 学习python 第一章

    目录 第一章... 1 1:新建项目... 1 2:修改默认模板... 3 3:什么是变量... 3 4:重指向... 3 5:常量的表示... 4 6:格式化输出(三种方法)... 4 7:打印一个 ...

  4. OpenGL超级宝典笔记——贝塞尔曲线和曲面(转)

    http://my.oschina.net/sweetdark/blog/183721 参数方程表现形式 在中学的时候,我们都学习过直线的参数方程:y = kx + b;其中k表示斜率,b表示截距(即 ...

  5. vs2008编译openssl,静态库/动态库,批处理

    ::前期准备准备工作::1,下载安装好ActivePerl,::2,下载Openssl源码::3,本机有安装vc::4,此例在vs2008(vc9),openssl-1.0.2o下完成 echo of ...

  6. 部署weblogic遇到的问题总结

    myeclipse开发的项目,运行在tomcat7上完全正常.部署到weblogic10上就出现了问题,现把问题记录一下: 1.找不到javax/servlet/jsp/jstl/core/Condi ...

  7. 将Vue-cli搭建的项目改造成多页面应用时对项目结构和配置的调整

    创建项目 首先初始化一个Vue项目模板,之后在模板下载时候会弹出如下配置选项 vue init webpack demo 配置好后按下回车就构建完成了Vue脚手架,之后cd进入项目,并且进行node模 ...

  8. Linux基础第一课——基础知识了解

    前言 发展历史 linus 林纳斯 赫尔辛基大学 在自己的笔记本上安上自己写的操作系统 基于Linux内核 Linux内核 也是基于unix内核开发出来 unix 不开源 只能军方和大学使用 Linu ...

  9. pdf阅读器开发

    文章基于sumatrapdf的实现(当中mupdf中的内容不会太多涉及).以及自己在此基础上做的 优化,扩展.详细效果能够參考百度阅读器精简版. 最NB的还是得属于foxit.渲染速度一流,展示大图片 ...

  10. (一)SSO之CAS框架通俗原理

    版权声明:本文为博主原创文章.转载请标明出处. https://blog.csdn.net/lovesummerforever/article/details/36068249 SSO统一验证     ...