[Head First设计模式]生活中学设计模式——外观模式
系列文章
[Head First设计模式]山西面馆中的设计模式——装饰者模式
[Head First设计模式]山西面馆中的设计模式——观察者模式
[Head First设计模式]山西面馆中的设计模式——建造者模式
[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式
[Head First设计模式]抢票中的设计模式——代理模式
[Head First设计模式]云南米线馆中的设计模式——模版方法模式
[Head First设计模式]餐馆中的设计模式——命令模式
[Head First设计模式]身边的设计模式——适配器模式
[Head First设计模式]生活中学设计模式——迭代器模式
[Head First设计模式]生活中学设计模式——组合模式
引言
一些软件安装之后,默认的是开机启动,假如一个用户对电脑不太懂,安装一些软件,就会采用软件默认安装的方式,而这些软件默认的是开机启动的,比如:暴风影音,酷狗,qq,杀毒软件,延迟加载的服务等。这些子系统,都在你按下开机键之后,用户不用再去双击这些快捷方式,所有的操作都交给windows系统来做。
如果使用外观模式,如何来实现呢?
外观模式定义
外观模式,提供一个统一的接口去访问多个子系统的多个不同的接口。
外观模式,定义了一个高层次的接口,使得子系统更容易被使用。
类图

参与者
外观类(Facade)
- 知道哪些子系统负责处理哪些请求。
- 将客户的请求传递给相应的子系统对象处理。
子系统类(SubSystem)
- 实现子系统的功能。
- 处理由外观传过来的任务。
- 子系统不用知道外观类。
- 在任何地方也没有应用外观类。
一个例子
namespace Wolfy.外观模式
{
/// <summary>
/// 外观类
/// </summary>
public class Windows
{
#region 使用组合将使用到的子系统组件,全部都在这里
KingSoft kingSoft;
BaoFeng baoFeng;
Kugou kugou;
QQ qq;
Service services;
#endregion public Windows(KingSoft kingSoft, BaoFeng baoFeng, Kugou kugou, QQ qq, Service services)
{
//外观将子系统中每一个组件的引用都传入它的构造函数中,然后外观把它们赋值给相应的实例变量
this.kingSoft = kingSoft;
this.baoFeng = baoFeng;
this.kugou = kugou;
this.qq = qq;
this.services = services;
}
public void StartWindows()
{
kingSoft.StartKingSoft();
baoFeng.StartBaofeng();
kugou.StartKugou();
qq.StartQQ();
services.StartService();
}
}
}
Windows
namespace Wolfy.外观模式
{
/// <summary>
/// 子系统类
/// </summary>
public class KingSoft
{
public void StartKingSoft()
{ Console.WriteLine("开启金山毒霸...."); }
}
}
KingSoft
namespace Wolfy.外观模式
{
/// <summary>
/// 子系统
/// </summary>
public class BaoFeng
{
public void StartBaofeng()
{
Console.WriteLine("开启暴风影音....");
}
}
}
BaoFeng
namespace Wolfy.外观模式
{
/// <summary>
/// 子系统类
/// </summary>
public class QQ
{
public void StartQQ()
{
Console.WriteLine("开启qq....");
}
}
}
namespace Wolfy.外观模式
{
/// <summary>
/// 子系统类
/// </summary>
public class Kugou
{
public void StartKugou()
{
Console.WriteLine("开启酷狗播放器....");
}
}
}
Kugou
namespace Wolfy.外观模式
{
/// <summary>
/// 子系统类
/// </summary>
public class Service
{
public void StartService()
{
Console.WriteLine("延迟加载服务....");
}
}
}
Service
namespace Wolfy.外观模式
{
class Program
{
static void Main(string[] args)
{
KingSoft kingSoft=new KingSoft();
BaoFeng baoFeng=new BaoFeng();
Kugou kugou=new Kugou();
QQ qq=new QQ();
Service services=new Service();
Windows windows = new Windows(kingSoft, baoFeng, kugou, qq, services);
windows.StartWindows();
Console.Read();
}
}
}
结果:

总结
优点
- 提供了一个简单且公用的接口去处理复杂的子系统,并且没有子系统的功能。
- 遮蔽了子系统的复杂性,避免了客户与子系统直接连接,也减少了子系统与子系统间的连接,每个子系统都有它的Facade模式,子系统Facade模式去访问其他子系统。
缺点
- 限制了客户的自由,减少了可变性。
适用性
- 需要复杂的子系统提供一个简单的接口。
- 客户与抽象的实现类中存在若干依赖。
- 子系统分层是必要的或架构要求的情况下。
[Head First设计模式]生活中学设计模式——外观模式的更多相关文章
- [Head First设计模式]生活中学设计模式——状态模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]生活中学设计模式——组合模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]生活中学设计模式——迭代器模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- Head First 设计模式之适配器模式与外观模式
Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ...
- 设计模式(九)外观模式Facade(结构型)
设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...
- 设计模式(二)-- 外观模式(Facade)
设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...
- Java设计模式(11)外观模式(Facade模式)
外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { C ...
- 设计模式(十一)外观模式(Facade Pattern)
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...
- 设计模式学习系列9 外观模式Facade
1.概述 自己卖了一辆越野自行车,但毕竟不是自己定制的,买回来之后可能需要更改一下脚蹬,座皮,里程计数器或者刹车系统,假如将自行车看做一个整体系统,对我们而言使用的是自行车,然后我们对自己车构件的修改 ...
随机推荐
- mvn常用命令
1. mvn compile 编译源代码 2. mvn test-compile 编译测试代码 3. mvn test 运行测试 4. mvn package 打包,根据pom.xml打成war或ja ...
- WPF系列 Style
参考 WPF: Customize your Application with Styles and Control Templates (Part 2 of 2)
- java设计模式之外观模式
外观模式概念 外观模式又称为门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个搞层次接口,使得这一个子系统更加容易使用.这一模式完美的体现了依赖倒转原则和迪米特法则的思想,所以是非常常 ...
- Mac如何找到从AppStore下载的正版Xcode安装包
前言:本文介绍在Mac下如何找到AppStore下载的安装包路径,以及如何提取出来供以后使用,希望对大家有所帮助(前提:想要提取某个安装包,前提是你正在从AppStore安装这个程序.比如你想提取im ...
- HiKariCP的数据源配置
<!-- Hikari Datasource --> <bean id="dataSourceHikari" class="com.zaxxer.hik ...
- IoC 与 AOP (谈谈你对 Spring 的理解)
一.Spring 实现了工厂模式的工厂类,这个类名为BeanFactory(实际上是一个接口),在程序中通常 BeanFactory 的子类 ApplicationContext. Spring相当于 ...
- iOS——学习网址收集+如何提高iOS开发技能
1 一个比系统自带的终端好用的软件:http://www.iterm2.com 2 学习和遇到技术问题可以去的网站: CocoaChina http://developer.cocoachi ...
- Visual Studio 2015的坑:中文字符串编译后成乱码
(2015年8月5日更新:微软已经修复了Roslyn的这个bug,详见 https://github.com/dotnet/roslyn/pull/4303 ) 昨天,我们用VS2015编译了博客程序 ...
- 通过Iframe在A网站页面内嵌入空白页面的方式,跨域获取B网站的数据返回给A网站!
以下代码只是为演示该方法具体是如何操作的,实际的意义并不大. 其实这个方法还可以解决很多方面的跨域操作,以下两点为我工作中遇到的情况! 比如A系统中打开B系统页面的时候,获取B系统页面高度,A系统中可 ...
- C#程序员的春天之从零开始学习unity3D游戏开发入门教程二(创建项目及基本面板介绍)
一项目创建: 创建项目是开发的第一步. 运行untiy之后如果是第一次运行会弹出 我们这里随便创建一个项目. 二Untiy面板介绍: 三代码编辑器的切换: 这里我安装了vs2012. 到这里开发环境基 ...