[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.概述 自己卖了一辆越野自行车,但毕竟不是自己定制的,买回来之后可能需要更改一下脚蹬,座皮,里程计数器或者刹车系统,假如将自行车看做一个整体系统,对我们而言使用的是自行车,然后我们对自己车构件的修改 ...
随机推荐
- android Bundle savedInstanceState用途
经常会出现用户按到home键,退出了界面,或者安卓系统意外回收了应用的进程,这种情况下,使用Bundle savedInstanceState就可以用户再次打开应用的时候恢复的原来的状态 (以下转自: ...
- mac 安装mysql + 修改root用户密码 + 及报Access denied for user 'root'@'localhost' (using password:YES)解决办法
1.下载MySQL 到mysql的官网http://dev.mysql.com/downloads/mysql/然后在页面中会看到“MySQL Community Server”下方有一个“downl ...
- Centos7 and docker practices
1. Failed to get D-Bus connection: Operation not permitted error when you execute the systemctl star ...
- BI报表系统在银行业的应用
在当前大数据的背景下,银行业传统联机业务技术存在开发周期长.不够灵活.大量的业务数据难以充分利用.操作复杂.监控效率低等弊端,多数企业表示需要搭建一个符合银行特色的商业智能平台,把需要的数据和信息集中 ...
- [转]教你一招 - 如何给nopcommerce增加一个类似admin的area
本文转自:http://www.cnblogs.com/wucf2004/p/nopcommerce-area.html asp.net mvc里面的area是什么,点击这里查看 如果在nopcomm ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 初识Quartz(入门案例)+常用的Cron表达式
1.Quartz架构图 1.实体层 package cn.happy.entity; //1. public class Plan { //时间 private String date; //任务 p ...
- GridView绑定Visible
hyerLinkFiled的显示绑定方式 ,强制类型转换后再绑定! Visible='<%#Convert.ToBoolean(Eval("字段名")) %>'
- 发布一个免费开源软件-- PAD流程图绘制软件PADFlowChart
软件的可执行文件下载:PADFlowChart-exe.zip MD5校验码:91FCA9FEC9665FD09BEB3DA94ADC1CE6 SHA1校验码:ECD742AA3092A085AB07 ...
- 如何使iframe透明
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...