适用性:
第一:
   当你要为一个复杂的子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具有可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制的用户可以超越Facade层。
第二:
  客户程序与抽象类的实现部分之间存在着很大的依耐性。引入facade将这个子系统与客户以及其他的子类系统分离,可以提高子系统的独立性和可移植性。

第三:
当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。 如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了他们之间的依赖关系。

实现:
第一:降低客户——子系统之间的耦合度。
用抽象类实现facade而它的具体子类对应于不同的子系统实现。这可以进一步降低客户与子系统的耦合度。这样,客户就可以通过抽象昂的Facade类接口与子系统通讯。这种抽象耦合的关系使得客户不知道它使用的是子系统的哪一个实现。
除生成子类的方法以外,另一种是用不同的子系统对象配置Facade对象。为定制Facade,仅需要对他的子系统对象(一个或多个)进行替换即可。
第二:
……选自《设计模式》

比较Facade模式与Adapter模式:
(一):在两个模式中,都存在既有的类。
(二):在Facade模式中,我们无须按某个接口进行设计;而在Adapter模式中,则必须按某个特定的接口进行设计。
(三):Facade不要多态,而Adaper需要多态。(但是《设计模式》否定了这种说法,上面实现的第一个加黑就是)
(四):Facade模式中的动机是简化接口,而Adapter,尽管也是越简单越好,但是设计必须遵循一个已有的接口,不能简化任何东西,即使可能存在更简单的接口。

结论:Facade简化了接口,而Adapter将一个模式转换成另外一个接口。
<<设计模式解析>>

class  Scanner ... {
public:
    Scanner(istream& );
    virtual ~Scanner();

    virtual Token& Scan();
private:
    istream& _inputStream;
}
class  Parser ... {
public:
    Parser();
    virtual ~Parser();
    virtual void Parse(Scanner&, ProgramNodeBulider& );
} ;
class  ProgramNodeBulider ... {
public:
    ProgramNodeBulider();
    virtual ProgramNode* NewVariable(const char* variableName) const;
    
    virtual ProgramNode* NewAssignment(ProgramNode* variable, 
        ProgramNode* expression) const;
    
    virtual ProgramNode* NewCondition(ProgramNode* truePart, 
        ProgramNode* falsePart) const;
    Program* GetRootNode();
private:
    ProgramNode* _node;
} ;
class  ProgramNode ... {
public:
    virtual void GetSourcePosition(int& line, int& index);
    virtual void Add(ProgramNode* );
    virtual void Remove(ProgramNode* );
protected:
    ProgramNode();
} ;
class  CodeGenerator ... {
public:
    virtual void Visit(StatementNode* );
    virtual void Visit(ExpressionNode* );
protected:
    CodeGenerator(ByteCodeStream& );
protected:
    BytecodeStream& _output;
} ;

class  Complier ... {
public:
    Complier();
    virtual void Complie(istream&, BytecodeStream&);
} ;

void  Complier::Complie(istream& input, BytecodeStream& output)
... {
    Scanner scanner(input);
    ProgramNodeBulider builder;
    Parser parser;

    parser.Parse(scanner, bulider);

    RISCCodeGenerator generator(output);
    ProgramNode* parseTree = builder.GetRootNode();
    parserTree->Traverse(generator);
}

Facade(外观)相关推荐

  1. 设计模式笔记 10.Facade 外观模式(结构型模式)

    10. Facade 外观模式      2008-8-18 动机(Motivation) 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种 ...

  2. 设计模式10: Facade 外观模式(结构型模式)

    Facade 外观模式(结构型模式) 系统的复杂度 假设我们要开发一个坦克模式系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎.控制器.车轮.车身等各个子系统构成. internal cl ...

  3. 设计模式学习之---Facade(外观)模式

    1.Facade外观模式,是一种接口型模式.这种模式的目的在于,它为子系统中的一组接口,定义了一个更高层次的接口,通过这个接口,提供一个统一的接口,使子系统更加容易使用. 2.实现:创建一个新的类,提 ...

  4. Facade外观模式

    Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战.在这里我想举一个例子: ...

  5. 设计模式之Facade(外观 总管 Manager)

    Facade模式的定义 : 为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare {Conn ...

  6. php5.1 facade,php设计模式 Facade(外观模式)

    模式定义:外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加 ...

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

    我们通过一个简单的开关电脑模拟程序来说明Facade模式(外观模式) CPU类 public class Cpu {  public void start()  {   system.out.prin ...

  8. Facade(外观模式)

    意图 为子系统中的一组接口提供一个一致的界面,_Facade_模式定义了一个高层接口,这个接口使得这一子系统更加易用. 动机 将一个系统划分成为若干个子系统有利于降低系统的复杂性.一个常见的设计目标是 ...

  9. [php]php设计模式 Facade(外观模式)

    1 <?php 2 /** 3 * 外观模式 示例 4 * 5 * 为子系统中的一组接口提供一个一致的界面,定义一个高层接口,使得这一子系统更加的容易使用 6 */ 7 class SubSyt ...

  10. Facade(外观模式) 结构型

    外观模式 一.概述 1.结构 2.适用场景 3.优缺点 4.区别 二.实例 一.概述 外观模式是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式.该模式对外有一个统一接 ...

最新文章

  1. MapReduce—第一个WordCount程序
  2. bootstrap轮播,播放到最后一张图片的时候,就不正确了。
  3. 树的距离(牛客网树上主席树+dfs序)
  4. AutoRest - 具有 C# 和 Razor 模板的 Swagger 规范代码生成器。
  5. 代码精进之路--思维导图
  6. ThoughtWorks洞见领域驱动设计思维导图笔记
  7. Web前端小例子——简单导航栏
  8. IT的2017,面临数字生态系统新挑战,该怎么办?
  9. 【无线也安全】屏蔽蹭网一族
  10. php异步通知并查询,服务器异步通知的接收by php
  11. java中说明书/开发文档如何编写?
  12. GBase学习-安装GBase 8a MPP Cluster V95
  13. FMEA在汽车开发过程中的实施-SunFMEA
  14. Using openRefine
  15. 拆解一探电路设计:小米路由器3C拆解
  16. JS版汉字与拼音互转终极方案,附简单的JS拼音
  17. 做直流逆变中用到的全桥逆变电路测试mos管好坏的方法
  18. 第十五届东北大学生编程大赛题解
  19. 台式电脑显示配置100%请勿关闭计算机,Win7关机提示“配置Windows Update已完成30%请勿关闭计算机”怎么解决...
  20. 【用pandas_alive几行代码绘制竞赛动图】10.新南威尔士州 COVID 可视化(测试代码+数据集+绘图参数解析)

热门文章

  1. Linux计划任务介绍
  2. 使用git更新仓库时出现unable to access ‘https://github.com/xxx: Failed to connect to github.com port 443: Time
  3. Java导出Excel(Poi详解)
  4. uni-app 微信小程序接入高德SDK
  5. Excel表格统计满足两列条件的总数:countifs方法
  6. 《STL源码剖析》-- stl_construct.h
  7. Windows8安装Visual Studio 2012的方法
  8. web开发框架_Web开发的最佳PHP框架
  9. 时间序列数据分析—概述
  10. Code,Diagram and Model