C#设计模式(11)——外观模式
一、概念
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合。
二、示意图

三、外观模式的实现
(1)不使用外观模式下选课系统的实现方式和客户端调用代码:
/// <summary>
/// 不使用外观模式的情况
/// 此时客户端与三个子系统都发送了耦合,使得客户端程序依赖与子系统
/// 为了解决这样的问题,我们可以使用外观模式来为所有子系统设计一个统一的接口
/// 客户端只需要调用外观类中的方法就可以了,简化了客户端的操作
/// 从而让客户和子系统之间避免了紧耦合
/// </summary>
class Client
{
static void Main(string[] args)
{
SubSystemA a = new SubSystemA();
SubSystemB b = new SubSystemB();
SubSystemC c = new SubSystemC();
a.MethodA();
b.MethodB();
c.MethodC();
Console.Read();
}
} // 子系统A
public class SubSystemA
{
public void MethodA()
{
Console.WriteLine("执行子系统A中的方法A");
}
} // 子系统B
public class SubSystemB
{
public void MethodB()
{
Console.WriteLine("执行子系统B中的方法B");
}
} // 子系统C
public class SubSystemC
{
public void MethodC()
{
Console.WriteLine("执行子系统C中的方法C");
}
}
(2)使用外观模式的实现:
/// <summary>
/// 以学生选课系统为例子演示外观模式的使用
/// 学生选课模块包括功能有:
/// 验证选课的人数是否已满
/// 通知用户课程选择成功与否
/// 客户端代码
/// </summary>
class Student
{
private static RegistrationFacade facade = new RegistrationFacade(); static void Main(string[] args)
{
if (facade.RegisterCourse("设计模式", "Learning Hard"))
{
Console.WriteLine("选课成功");
}
else
{
Console.WriteLine("选课失败");
} Console.Read();
}
} // 外观类
public class RegistrationFacade
{
private RegisterCourse registerCourse;
private NotifyStudent notifyStu;
public RegistrationFacade()
{
registerCourse = new RegisterCourse();
notifyStu = new NotifyStudent();
} public bool RegisterCourse(string courseName, string studentName)
{
if (!registerCourse.CheckAvailable(courseName))
{
return false;
} return notifyStu.Notify(studentName);
}
} #region 子系统
// 相当于子系统A
public class RegisterCourse
{
public bool CheckAvailable(string courseName)
{
Console.WriteLine("正在验证课程 {0}是否人数已满", courseName);
return true;
}
} // 相当于子系统B
public class NotifyStudent
{
public bool Notify(string studentName)
{
Console.WriteLine("正在向{0}发生通知", studentName);
return true;
}
}
#endregion
四、外观模式的结构

五、外观模式的优缺点:
1、优点:
(1)外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
(2)外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。
2、缺点:
(1)如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了”开——闭原则“(不过这点也是不可避免)。
C#设计模式(11)——外观模式的更多相关文章
- C#设计模式(11)——外观模式(Facade Pattern)
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...
- 再起航,我的学习笔记之JavaScript设计模式11(外观模式)
经过一段时间的学习与分享,我们对创建型设计模式已经有了一定的认识,未来的一段时间里我们将展开新的篇章,开始迈入结构性设计模式的学习. 结构性设计模式与创建型设计模式不同,结构性设计模式更偏向于关注如何 ...
- C#设计模式(11)——外观模式(Facade Pattern)(转)
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...
- 每天一个设计模式-2 外观模式(Facade)
每天一个设计模式-2 外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...
- 乐在其中设计模式(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.外观模式
随机推荐
- window 上创建 .gitignore文件
由于 git默认不上传空文件夹,如果需要上传空文件夹,那么需要这样上传空文件,官方给出这样的做法~~ (需要创建.gitignore文件) 在linux 上比较好操作了,这里说下在window 上 创 ...
- Gradle-jar-aar
Ref:Android Studio系列教程 Ref:Android Studio系列教程四--Gradle基础 Ref:Intellij IDEA 14.x 中的Facets和Artifacts的区 ...
- R语言数据管理(二):模式与类
最常用的4种数据类型是数值型(numeric).字符型(character)(字符串).日期型(Date)或POSIXct(基于日期的).逻辑型(logical)(TRUE或FALSE). 变量中 ...
- 请简单介绍一下Spring
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. Spring ...
- MD5文件
我从某网站下载了一个iso系统镜像,我担心下载下来之后,被我电脑上的病毒感染了.我要确定这个文件还是“原汁原味”,就可以用软件再次生成该文件的md5码,然后和网站上的md5码对比一下就可以了.我用的是 ...
- winform窗体取消最大化双击标题最大化
实现目标,固定窗体大小,1.窗体标题去掉最大化按钮2.双击窗体标题也不会最大化,彻底取消最大化 问题,如果设置窗体MaximizeBox和MinimumSize属性,看似问题解决了,单随之而来的问题是 ...
- 浏览器对同一IP的最大并发请求数记录
转载自http://www.iefans.net/liulanqi-zuida-bingfa-lianjieshu/,以方便查阅 版本 HTTP 1.0 服务器(宽带连接) HTTP 1.1 服务器( ...
- <HTTP协议详解>由浅入深看HTTP
一. HTTP协议的应用简单概况 HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式.2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST ...
- 《机器学习实战》学习笔记第十一章 —— Apriori算法
主要内容: 一.关联分析 二.Apriori原理 三.使用Apriori算法生成频繁项集 四.从频繁项集中生成关联规则 一.关联分析 1.关联分析是一种在大规模数据集中寻找有趣关系的任务.这些关系可以 ...
- 算法(Algorithms)第4版 练习 2.2.5
top-down: M E R G E S O R T E X A M P L E M E R G E S O R T E X A M P L E E X A M P L E merge(input, ...