C#设计模式(8)——外观模式
1.外观模式介绍
外观模式也被叫做门面模式,这种模式的作用是:隐藏系统的复杂性,并向客户端提供了一个可以访问系统的统一接口,这个统一的接口组合了子系统的多个接口。使用统一的接口使得子系统更容易被访问或者使用。 以去医院看病为例,去医院看病时可能要去挂号、门诊、划价、取药等,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。我们先了解下外观模式的三种角色:
子系统角色:实现了各种子功能,子系统之间可以相互交户,也可以提供给客户端直接调用的接口。
门面角色:熟悉子系统的功能,可以把子系统的功能组合在一起然后提供一个统一的接口供客户端调用。
客户端角色:调用Facede来实现要完成的功能。

下边使用网友的电脑开关机的例子(链接:java设计模式之外观模式(门面模式))介绍外观模式的用法:每台电脑都有CPU,Memory,Disk。我们开关电脑时不会一个一个地打开或关闭各个部件,而是通过一个统一的开关机按钮一次性打开各个部件。通过外观模式可以实现用户的与部件间的解耦。

子系统(cpu,memory,disk)代码:
/// <summary>
/// CPU子系统
/// </summary>
public class CPU
{
public void CPUStart()
{
Console.WriteLine("CPU is start...");
}
public void CPUShutdown()
{
Console.WriteLine("CPU is shot down...");
}
} /// <summary>
/// 内存子系统
/// </summary>
public class Memory
{
public void MemoryStart()
{
Console.WriteLine("Memory is start...");
}
public void MemoryShutdown()
{
Console.WriteLine("Memory is shot down...");
}
} /// <summary>
/// 硬盘子系统
/// </summary>
public class Disk
{
public void DiskStart()
{
Console.WriteLine("Disk is start...");
}
public void DiskShutdown()
{
Console.WriteLine("Disk is shot down...");
}
}
门面类(Computer)代码:
/// <summary>
/// 电脑 facede角色
/// </summary>
public class Computer
{
private CPU cpu;
private Memory memory;
private Disk disk;
public Computer()
{
this.cpu = new CPU();
this.memory = new Memory();
this.disk = new Disk();
} public void Start()
{
cpu.CPUStart();
memory.MemoryStart();
disk.DiskStart();
Console.WriteLine("computer start end!");
}
public void Shutdown()
{
cpu.CPUShutdown();
memory.MemoryShutdown();
disk.DiskShutdown();
Console.WriteLine("computer shutdown end!");
}
}
客户端调用:
class Program
{
static void Main(string[] args)
{
Computer computer = new Computer();
//开机
computer.Start();
Console.WriteLine();
//关机
computer.Shutdown();
Console.ReadKey();
}
}
程序运行结果:

2.小结
外观模式的使用:
外观模式在我们的开发中使用的比较频繁,以三层架构为例:
子系统角色:Dal层,负责数据访问,比如有UserDal和RoleDal,UserDal返回的数据格式为[名字:张三,角色ID:3],RoleDal层返回的数据格式[角色ID:3,角色名:管理员]
门面角色:Bll层,负责具体业务(汇总子系统的功能,这里使用UserDal和RoleDal两个子系统角色的功能),返回的数据格式[名字:张三 ,角色名:管理员]
客户端角色:UI层,通过Bll层直接拿到格式如[名字:张三 ,角色名:管理员]的数据。
外观模式的优点:
1.隐藏了系统的复杂性,让客户端使用系统功能时变很简单;
2.实现客户端和子系统间的解耦。
外观模式的缺点:
1.不符合开闭原则,如客户端要使用更多功能时,不仅仅在子系统进行添加或修改操作,也必须修改门面层。
C#设计模式(8)——外观模式的更多相关文章
- 每天一个设计模式-2 外观模式(Facade)
每天一个设计模式-2 外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...
- C#设计模式(11)——外观模式(Facade Pattern)
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- 设计模式之 外观模式详解(Service第三者插足,让action与dao分手)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,LZ今天给各位分享一 ...
- 8.4 GOF设计模式三: 外观模式 Facade
GOF设计模式三: 外观模式 Facade “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...
- 北风设计模式课程---外观模式(Facade)总结
北风设计模式课程---外观模式(Facade)总结 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用户获得装备,我可以先装备 ...
- js设计模式——2.外观模式
js设计模式——2.外观模式
- python设计模式之外观模式
python设计模式之外观模式 系统会随着演化变得非常复杂,最终形成大量的(并且有时是令人迷惑的)类和交互,这种情况并不少见.许多情况下,我们并不想把这种复杂性暴露给客户端.外观设计模式有助于隐藏系统 ...
- java设计模式之外观模式(门面模式)
针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下. 一.概念介绍 外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计 ...
- 【GOF23设计模式】外观模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_外观模式.公司注册流程.迪米特法则 package com.test.facade; public interface 工 ...
随机推荐
- [NOIp2016] 蚯蚓
类型:单调队列 传送门:>Here< 题意:有$N$只蚯蚓,每秒都会伸长$q$.每一次都会有人选出最长的一条切成两半,长度分别是$\left \lfloor px \right \rflo ...
- Ionic3新页面去除Tabs的菜单问题总结
问题 要求在[我的]页面,点击[退出登录]按钮,返回到登录页面. 使用 this.navCtrl.setRoot(LoginPage); 或者 this.navCtrl.push(LoginPage) ...
- BZOJ4695 最假女选手(势能线段树)
BZOJ题目传送门 终于体会到初步掌握势能分析思想的重要性了. 一开始看题,感觉套路还是很一般啊qwq.直接在线段树上维护最大值和最小值,每次递归更新的时候,如果不能完全覆盖就暴力递归下去.挺好写的欸 ...
- Hdoj 1003.Max Sum 题解
Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...
- 自学华为IoT物联网_12 Huawei LiteOS基础架构
点击返回自学华为IoT物流网 自学华为IoT物联网_12 Huawei LiteOS基础架构 一.1个Huawei LiteOS Kernel 1.1 huawei LiteOS Kernel基本框架 ...
- 自动驾驶技术之——无人驾驶中的CAN总线
CAN总线在整个无人驾驶系统中有着十分重要的作用.除了在VCU信号需要通过CAN总线进行传输外,无人车上的某些传感器(如雷达.Mobileye)的信号传递也是通过CAN实现的. 前言 本文主要内容是— ...
- 普及一个Linux的小技能~Ctrl+Z切换到后台运行
逆天Linux一直是自己摸索的,几年下来也小有心得,前不久PC也换成Ubuntu了,但毕竟不是专门搞运维的,有些知识还是有死角 这不,今天发现了个小技巧,来和大家分享一下: 比如运行一个交互式的程序: ...
- angular与vue的应用对比
因为各种笔试面试,最近都没时间做一些值得分享的东西,正好复习一下vue技术栈,与angular做一下对比. angular1就跟vue比略low了. 1.数据绑定 ng1 ng-bind,{{ sco ...
- 解决SecureCRT无法用非root账号登录ssh
原文: http://blog.csdn.net/zxx2403/article/details/46959047 链接失败,提示这个: --------------------------- Sec ...
- java ArrayList去重
对list集合中的重复值进行处理,大部分是采用两种方法, 一种是用遍历list集合判断后赋给另一个list集合, 另一种是用赋给set集合再返回给list集合. 方法1:set集合去重,不打乱顺序 L ...