C#设计模式——外观模式(Facade Pattern)
一、概述
在系统设计中,某一个系统可能非常庞大,用户要使用该系统就不得不掌握大量的接口,造成使用的不便。这时可以考虑将该系统细分成一系列子系统并使子系统间的耦合降到最低,利用外观模式提供一个外观对象,为这一系列子系统提供一个简单的使用接口,这样用户只需要掌握外观对象上的少量接口即可使用该系统。就以汽车为例,一辆汽车由引擎、车轮、刹车等无数子系统构成,大多数用户在实际使用过程中并不关心这些子系统之间的工作细节,他们只希望能简单的启动、刹车即可。
二、外观模式
外观模式为系统中的一组接口定义了一个高层接口,这个接口使得这一系统更加容易使用。外观模式能有效简化外部程序和系统间的交互接口,将外部程序的演化和内部子系统的变化之间的依赖解耦。其结构图如下:

Facade知道哪些子系统类负责处理请求,并将客户请求代理给适当的子系统对象。
Subsystem classes实现了子系统的功能,处理由Facade对象指派的任务,但并不包含Facade对象的任何信息。
三、示例
我们就拿汽车为例。
首先定义引擎、车轮、刹车等子系统。

1 class Engine
2 {
3 public void Start()
4 {
5 Console.WriteLine("Engine Start");
6 }
7 }
8
9 class Wheel
10 {
11 public void TurnOn()
12 {
13 Console.WriteLine("Wheel is turned");
14 }
15 public void Stop()
16 {
17 Console.WriteLine("Wheel is stopped");
18 }
19 }
20
21 class Braker
22 {
23 public void Brake()
24 {
25 Console.WriteLine("Brake!");
26 }
27 }

接着定义汽车的Facade对象。

1 class CarFacade
2 {
3 private Engine _engine;
4 private Wheel[] _wheels;
5 private Braker _braker;
6
7 public CarFacade()
8 {
9 _engine = new Engine();
10 _wheels = new Wheel[4];
11 for (int i = 0; i < _wheels.Length; i++)
12 {
13 _wheels[i] = new Wheel();
14 }
15 _braker = new Braker();
16 }
17 public void Run()
18 {
19 _engine.Start();
20 foreach (Wheel wheel in _wheels)
21 {
22 wheel.TurnOn();
23 }
24 }
25 public void Brake()
26 {
27 _braker.Brake();
28 foreach (Wheel wheel in _wheels)
29 {
30 wheel.Stop();
31 }
32 }
33 }

这样我们只需要使用Façade对象即可实现对汽车的操作。

1 static void Main(string[] args)
2 {
3 CarFacade car = new CarFacade();
4 car.Run();
5 car.Brake();
6 Console.ReadLine();
7 }

C#设计模式——外观模式(Facade Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- 设计模式系列之外观模式(Facade Pattern)——提供统一的入口
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 二十四种设计模式:外观模式(Facade Pattern)
外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...
- 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...
- 设计模式-外观模式(Facade)
简介 外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行. 由两部分组成: 门面角色:供外部调用,内部可能组装了多个子系统,多个方法. 子系统角色:子系统的方法也可以直接供外 ...
- 设计模式(八): 从“小弟”中来类比"外观模式"(Facade Pattern)
在此先容我拿“小弟”这个词来扯一下淡.什么是小弟呢,所谓小弟就是可以帮你做一些琐碎的事情,在此我们就拿“小弟”来类比“外观模式”.在上面一篇博文我们完整的介绍了“适配器模式”,接下来我们将要在这篇博客 ...
- python : 设计模式之外观模式(Facade Pattern)
#为啥要用外观模式举例说明 这个例子很形象,直接从人家博客上贴过来的,参考链接在下面 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶.茶具和开水,如图1(A)所示,而 ...
- 【UE4 设计模式】外观模式 Facade Pattern
概述 描述 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.外观模式又称为门面模式,它是一 ...
- 外观模式Facade pattern
http://www.runoob.com/design-pattern/facade-pattern.html 外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一 ...
随机推荐
- 我常用的Mac快捷键
1. 最小化当前窗口 command m 2. 在不同应用间切换 command tab 3. 在同一应用的不同窗口间切换 command ` 4. 在浏览器同一窗口的不同标签间切换 ctrl tab ...
- Android NDK 同时编译多个Module
LOCAL_PATH := $(call my-dir) ## ## NDK 支持同时编译多个Module: ## 在配置的时候,每个Module需要 以 include $(CLEAR_VARS)开 ...
- Jenkins:”ResourceRules.plist: cannot read resources” error after Xcode 6.1
在 Custom xcodebuild arguments 处填入: "CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plis ...
- 在GridView中使用radioButoon
在GridView中使用radioButoon 方法一: <input type="radio" id='radioSelectFeed' name="radioD ...
- 图解 & 深入浅出 JavaWeb:Servlet 再说几句
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- iOS8中使用CoreLocation定位[转]
本文转自:http://blog.devzeng.com/blog/ios8-corelocation-framework.html iOS8以前使用CoreLocation定位 1.首先定义一个全局 ...
- 泊松回归(Poisson Regression)
本博客已经迁往http://www.kemaswill.com/, 博客园这边也会继续更新, 欢迎关注~ Linear Regression预测的目标\(Y\)是连续值, Logistic Regre ...
- undercore & Backbone对AMD的支持(Require.js中如何使用undercore & Backbone)
RequireJS填补了前端模块化开发的空缺,RequireJS遵循AMD(异步模块定义,Asynchronous Module Definition)规范,越来越多的框架支持AMD,像最近的jQue ...
- managed_shared_memory.construct造成的性能损失
boost中的IPC进程间通信非常好用,可以直接在共享内存上创建对象,相当于new分配器,实测发现它的分配算法还是有点耗时.第一个测试代码仅仅分配一次,然后频繁的复制,每秒钟可以复制4200次左右. ...
- ES6转ES5:Gulp+Babel
目标: ES6代码转成ES5 对转换后的ES5进行压缩 以上步骤自动监控执行 步骤: 1.安装插件 在命令行中定位到项目根目录 安装全局 Gulp npm install -g gulp 安装项目中使 ...