设计模式 笔记 外观模式 Facade
//---------------------------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的更多相关文章
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- 8.4 GOF设计模式三: 外观模式 Facade
GOF设计模式三: 外观模式 Facade “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...
- 二十四种设计模式:外观模式(Facade Pattern)
外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...
- [设计模式] 10 外观模式 facade
外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来.客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构. ...
- 设计模式之外观模式(Facade)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 【设计模式】—— 外观模式Facade
前言:[模式总览]——————————by xingoo 模式意图 外观模式主要是为了为一组接口提供一个一致的界面.从而使得复杂的子系统与用户端分离解耦. 有点类似家庭常用的一键开关,只要按一个键,台 ...
- 结构型设计模式之外观模式(Facade)
结构 意图 为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性 当你要为一个复杂子系统提供一个简单接口时.子系统往往因 ...
- python : 设计模式之外观模式(Facade Pattern)
#为啥要用外观模式举例说明 这个例子很形象,直接从人家博客上贴过来的,参考链接在下面 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶.茶具和开水,如图1(A)所示,而 ...
- 【UE4 设计模式】外观模式 Facade Pattern
概述 描述 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.外观模式又称为门面模式,它是一 ...
随机推荐
- C#多线程的用法10-线程池
TheadPool:在进行多线程编程时,如果不想频繁的创建线程,那可以考虑使用使用线程池来完成多线程编程的工作.你只需将要处理的任务交付给ThreadPool,如果ThreadPool中有空闲的线程, ...
- 03-03_启动weblogic domain
本文重点: 直接启动weblogic 控制台访问 weblogic概念及手工启动脚本分析 启动weblogic 启动admin Server做了哪些事情 一.直接启动weblogic [roo ...
- 初识java内存区域
目录: 1.运行时数据区域 2.对象的创建 3.对象的内存布局 4.对象的访问定位 一.运行时数据区域 基本的java虚拟机运行时数据区如下图: 下面我们就来逐个认识这几个运行时的数据区域 1.程序计 ...
- 转:.NET 面试题汇总(一)
目录 本次给大家介绍的是我收集以及自己个人保存一些.NET面试题 简介 1.C# 值类型和引用类型的区别 2.如何使得一个类型可以在foreach 语句中使用 3.sealed修饰的类有什么特点 4. ...
- 【爬坑】在 IDEA 中运行 Hadoop 程序 报 winutils.exe 不存在错误解决方案
0. 问题说明 环境为 Windows 10 在 IDEA 中运行 Hadoop 程序报 winutils.exe 不存在 错误 1. 解决方案 [1.1 解压] 解压 hadoop-2.7.3 ...
- 【转】Java学习---线程间的通信
[原文]https://www.toutiao.com/i6572378564534993415/ 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: 这里主要 ...
- windows注册表
如何导入与导出注册表 进入注册表编辑器,选择“文件”“导出”命令,打开“导出注册表文件”对话框.选择保存位置并为其取名,单击保存即可完成注册表的备份. 打开注册表编辑器,选择“文件”“导入”命令,打开 ...
- HTML5 学习总结(三)——本地存储(localStorage、sessionStorage、WebSqlDataBase、IndexedDB)
HTML5问世以后,前端加入了一个重要的功能,便是本地存储,本地存储可分为4类: Local Storage:总的存储量有所限制,并不能提供真正的检索API,数据的生命期比窗口或浏览器的生命期长,数据 ...
- 加强对HEAD 请求的处理(转贴)
最近发现有些搜索引擎爬虫在抓取数据的时候,先是通过一个HEAD 请求获取response的header 信息,然后再通过GET 请求获取response 的body信息(即页面的内容)——先发送HEA ...
- docker swarm英文文档学习-2-关键概念
参考https://docs.docker.com/engine/swarm/key-concepts/ Swarm mode key concepts集群模式关键概念 本主题介绍Docker Eng ...