简介

外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行。

由两部分组成:

  1. 门面角色:供外部调用,内部可能组装了多个子系统,多个方法。
  2. 子系统角色:子系统的方法也可以直接供外部调用。一般来说,将常用的方法放在门面角色里面调用,门面角色对其来说相当于一个客户端而已。

具体实例

交易的保存,交易的保存涉及到交易本身数据库表的保存、余额的调整、交易修改备案的记录等操作。

相关子类的代码为:

/// <summary>
/// 交易保存类--子系统1
/// </summary>
class TradeManager
{
public void SaveTrade(Trade aTrade)
{
Console.WriteLine("交易编号为{0}的交易保存成功", aTrade.NO);
}
} /// <summary>
/// 交易修改备案类--子系统2
/// </summary>
public class TradeDiffManager
{
public void DiffTrade(Trade aTrade)
{
Console.WriteLine("交易编号为{0}的交易修改备案保存成功", aTrade.NO);
}
} /// <summary>
/// 交易余额记账类--子系统3
/// </summary>
public class TradeClearManager
{
public void ClearTrade(Trade aTrade)
{
Console.WriteLine("交易编号为{0}的交易余额记账成功", aTrade.NO);
}
}

如果每个客户端保存交易时,每次都依次调用上述代码,会使客户端显得累赘,代码可读性变差。

代码为:

public class ClientTest
{
public static void Main(string[] args)
{
Trade trade = new Trade();
trade.NO = 100; TradeManager tradeManager = new TradeManager();
tradeManager.SaveTrade(trade); TradeDiffManager tradeDiffManager = new TradeDiffManager();
tradeDiffManager.DiffTrade(trade); TradeClearManager tradeClearManager = new TradeClearManager();
tradeClearManager.ClearTrade(trade); Console.ReadLine();
}
}

使用外观模式,将本来在客户端依次调用的一组方法放在门面角色里面统一处理。

代码为:

public class FacadeClass
{
public void SaveTrade(Trade aTrade)
{
TradeManager tradeManager = new TradeManager();
tradeManager.SaveTrade(aTrade); TradeDiffManager tradeDiffManager = new TradeDiffManager();
tradeDiffManager.DiffTrade(aTrade); TradeClearManager tradeClearManager = new TradeClearManager();
tradeClearManager.ClearTrade(aTrade);
}
} public class ClientTest
{
public static void Main(string[] args)
{
Trade trade = new Trade();
trade.NO = 100; FacadeClass facade = new FacadeClass();
facade.SaveTrade(trade); Console.ReadLine();
}
}

补充分析

1.门面类(即上文中的FacadeClass)本身可以很多个,针对不同用途,对子系统的各个方法进行组装。

2.一般来说,门面类只有一个实例(上面为了简单起见,没有把门面类定义为Singleton)

3.门面类本身一般没有实现代码,只是为各个子系统提供一个集中的调用接口。

优点:

1.为复杂的子系统提供一个简单接口。

2.提供子系统的独立性。子系统不需要知道门面类,门面类只是他的一个客户端而已。子系统本身的方法也可以直接供外面调用。

3.在层次化结构中,可以使用外观模式定义每一层的入口。

设计模式-外观模式(Facade)的更多相关文章

  1. C#设计模式——外观模式(Facade Pattern)

    一.概述 在系统设计中,某一个系统可能非常庞大,用户要使用该系统就不得不掌握大量的接口,造成使用的不便.这时可以考虑将该系统细分成一系列子系统并使子系统间的耦合降到最低,利用外观模式提供一个外观对象, ...

  2. 大话设计模式--外观模式 Facade -- C++实现实例

    1.  外观模式: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这个子系统更加容易使用. 外观模式的使用场合: A: 设计初期阶段,应该要有意识的将不同的两个层分离. ...

  3. 设计模式--外观模式Facade(结构型)

    一.外观模式 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观模式定义了一个高层接口,让子系统更容易被使用. 二.UML图 三.例子 举个编译器的例子,假设编译一个程序需要经过四个步骤: ...

  4. 【转】设计模式(九)外观模式Facade(结构型)

    设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...

  5. 设计模式(九)外观模式Facade(结构型)

    设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...

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

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

  7. 设计模式(二)-- 外观模式(Facade)

    设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...

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

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

  9. 设计模式系列之外观模式(Facade Pattern)——提供统一的入口

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

随机推荐

  1. ubuntu14.04 wifi驱动安装

    重装linux后,一直搜不到wlan0,无法启动wifi,经过重重努力,终于成功,在此简单记录一下. 1. 查看网卡类型: ~$ lspci -nn -d 14e4: :]: Broadcom Cor ...

  2. C++中为什么构造函数不能是虚函数,析构函数是虚函数

    一, 什么是虚函数? 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语 ...

  3. JAVA中日期处理

    一.日期和long类型数据的相互转换 public class Hello { public static void main(String[] args) throws Exception { // ...

  4. 怎么在logcat中显示system.com.print中的打印信息

    在logcat中显示信息可以用Log.v() Log.d() Log.i() Log.w() 以及 Log.e() 1.Log.v 的调试颜色为黑色的,任何消息都会输出: 2.Log.d的输出颜色是蓝 ...

  5. java静态内部类

    public class StaticInnerClass {        int x=100;    static class inner{        void doitInner()     ...

  6. BC之The mook jong

    Problem Description ZJiaQ want to become a strong man, so he decided to play the mook jong.ZJiaQ wan ...

  7. Bootstrap栅格系统

    栅格系统分为两种:默认栅格系统 row,流式栅格系统 row-fluid. row 默认栅格系统:即指定了每个栅格的宽度为60px,间距为20px.共有12个栅格.总宽度为940px; 即12个栅格= ...

  8. c# MessageBox使用

    最近一直用到winform的MessageBox,感觉还是很混乱.刚好在网上发现xuenzhen的博客,特此借鉴记录一些东西. 下面的MessageBox的九中用法,来自xuenzhen的博客:htt ...

  9. QT5.3.2在ARM上的移植

    ubuntu10.04 准备移植phonon,4.5移植失败.播放声音就出错...没办法.转移到QtMutimedia 安装交叉编译工具这里就不提了... 1.下载QT5.3.2:http://dow ...

  10. 游戏设计模式系列(一)—— 单线逻辑&&数据驱动,搞定最容易卡死的结算界面

    从事游戏行业1年多了,个中心酸不知从何说起.抛开非技术的不说,一个开发者需要面对的最大问题,可能就是和策划频繁改变的需求做斗争了吧,这时候就体现了设计模式的重要性,抛开正式的设计方式不说,先讲讲我1年 ...