//---------------------------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. 给Jqgrid添加横向滚动条,实现点击行数据,触发事件。

    function reloadNoKitScheduleGridData() { $("#noKittingScheduleList").jqGrid({ url: ". ...

  2. 处理 Windows 虚拟机的计划内维护通知

    Azure 定期执行更新,以提高虚拟机的主机基础结构的可靠性.性能及安全性. 更新包括如下更改:修补托管环境或升级以及解除硬件授权. 大多数此类更新在执行时不会影响托管的虚拟机. 但是,也会存在更新产 ...

  3. 关于Apache连接数限制的设置

    昨天晚上收到监视团队的电话,说web服务器连不上.(作为DBA,这貌似超出了我的工作范畴啊...) 于是马上VPN连上服务器,发现网络负载均衡下的两台Apache服务器都没有响应,而服务器OS层面上正 ...

  4. js拼接table查询信息部分

    其一: $("#datagrid").empty(); var a=0; <order-rows> a++; $("#datagrid").appe ...

  5. 使用AndroidStudio上传忽略文件至SVN Server的解决措施

    在同组项目进行共享时,容易把本地的配置文件比如*.iml等文件上传至共享服务器,这样会对队友造成巨大的麻烦,为了解决这个问题,可以使用下面方法解决,下面以上传到服务器的app.iml文件为例. 一.在 ...

  6. 【转】Linux下从TCP状态机,三次握手判断DDOS攻击

    从TCP状态机判断DDOS攻击 一.TCP协议 TCP 协议是传送层的核心协议,提供了可靠面向连接的协议,分为三次握手和四次断开,在这个过程中TCP有个状态机,记录不同阶段的状态. 二. TCP握手和 ...

  7. 难度并不NOIP的NOIP模拟赛

    今天老师请了前几届的学长来讲课,可是讲课为什么要考试呢... 学长说难度是NOIP,于是我就naive的跟着参加了,然而T3难度并不友好,感觉确实不是很适合我们现在做......不过课本来也不是给我们 ...

  8. BZOJ4810:[YNOI2017]由乃的玉米田(莫队,bitset)

    Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题   这个题是这样的: 给你一 ...

  9. 哪些地方会出现css阻塞,哪些地方会出现js阻塞?

    Js的阻塞特性: 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等.直到JS下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容.为了提高用户体验,新一代浏览器 ...

  10. day1-课堂代码

    # # a = 1 # b = a # print(b) # # c = a + 1 # print(c) # # def add(x,y): # return x+y # # d = add(3,5 ...