系列文章

[Head First设计模式]山西面馆中的设计模式——装饰者模式

[Head First设计模式]山西面馆中的设计模式——观察者模式

[Head First设计模式]山西面馆中的设计模式——建造者模式

[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

[Head First设计模式]一个人的平安夜——单例模式

[Head First设计模式]抢票中的设计模式——代理模式

[Head First设计模式]面向对象的3特征5原则

[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....");
}
}
}

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设计模式]生活中学设计模式——外观模式的更多相关文章

  1. [Head First设计模式]生活中学设计模式——状态模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  2. [Head First设计模式]生活中学设计模式——组合模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  3. [Head First设计模式]生活中学设计模式——迭代器模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  4. Head First 设计模式之适配器模式与外观模式

    Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ...

  5. 设计模式(九)外观模式Facade(结构型)

    设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...

  6. 设计模式(二)-- 外观模式(Facade)

    设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...

  7. Java设计模式(11)外观模式(Facade模式)

    外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { C ...

  8. 设计模式(十一)外观模式(Facade Pattern)

    一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...

  9. 设计模式学习系列9 外观模式Facade

    1.概述 自己卖了一辆越野自行车,但毕竟不是自己定制的,买回来之后可能需要更改一下脚蹬,座皮,里程计数器或者刹车系统,假如将自行车看做一个整体系统,对我们而言使用的是自行车,然后我们对自己车构件的修改 ...

随机推荐

  1. ES5 的 setter 和 getter

    有两种方式使用 setter 和 getter 1. set/get var person = { _name: '', get name() { return this._name }, set n ...

  2. vim74安装

    1) 常用编译选项 ./configure --with-features=huge \ --enable-multibyte \ --enable-rubyinterp \ --enable-pyt ...

  3. 在阿里云服务器(ECS)上从零开始搭建nginx服务器

    本文介绍了如何在阿里云服务器上从零开始搭建nginx服务器.阿里云服务器(ECS)相信大家都不陌生,感兴趣的同学可以到http://www.aliyun.com/product/ecs去购买,或到体验 ...

  4. nginx 301 永久重定向

    nginx301跳转设置很简单,配置如下. (配置文件默认为nginx.conf,如果制定了新的配置文件,在新的文件配置即可.) server{ server_name xxx.com www.xxx ...

  5. [转]html超链接打开的窗口大小

    <a href="#" onclick="javascript:window.open('http://www.baidu.com','','height=20,w ...

  6. 【2016-10-27】【坚持学习】【Day14】【VS 配置管理器 AssemblyInfo 】

    有这样一个需求,不同客户,有不同的逻辑,通过配置管理器和条件编译进行 自动执行正确的代码.

  7. Bootstrap 简介

    一.Bootstrap介绍 Bootstrap 是最受欢迎的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB 项目.本课时讲解 Bootstrap 的概念,并介绍 Boo ...

  8. java1.8函数式编程概念

    有关函数式编程 ·1 函数作为一等公民 特点:将函数作为参数传递给另外一个函数:函数可以作为另外一个函数的返回值 ·2 无副作用 函数的副作用指的是函数在调用过程中,除了给出了返回值外,还修改了函数外 ...

  9. magnitude是精确距离,sqrMagnitude是节省CPU的粗略距离,精度有损失

    magnitude是精确距离,sqrMagnitude是节省CPU的粗略距离,精度有损失 CubeA坐标 x:0 y:0.844 z:0 CubeC坐标 x:0 y:0 z:0 Vector3 aaa ...

  10. echarts在.Net中使用实例(一) 简单的Demo

    前言 这个必须要有前言,即便很短,对于有强迫症的人来说不容易啊.言归正传,之前做图一直使用rdlc自带的格式,虽然任务完成,但是一直觉得不太美观, 空余时间开始找其他的插件,终于找到了Highchar ...