系列文章

[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. Mysql错误:Ignoring query to other database解决方法

    Mysql错误:Ignoring query to other database解决方法 今天登陆mysql show databases出现Ignoring query to other datab ...

  2. java自带工具-jps、jinfo、jstack、jstat、jmap

    掌握java自带的这些监控工具,有助与我们很好的分析问题和jvm性能调优秀.收集了些网上整理很好的文章. Java监控工具.调优.调试辅助函数 Java自带的GUI性能监控工具Jconsole以及Ji ...

  3. java自带工具-javap使用

    javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码.通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作,有助与我们更加理解java特性. javap(反汇编命令) ...

  4. sql中毫秒数与格式化时间的转换

    使用MYSQL自带的函数FROM_UNIXTIME(unix_timestamp,format). 如: SELECT FROM_UNIXTIME(1461201575895/1000,"% ...

  5. MVC PartialView

      参考 Updating an MVC Partial View with Ajax RenderPartial vs RenderAction vs Partial vs Action in MV ...

  6. SSTABLE简介

    SSTABLE数据组织:http://blog.csdn.net/tankles/article/details/7663905

  7. Hibdernate入门

    Hibernate中java对象的三种状态 瞬时状态(Transient):通过NEW创建对象后对象并没有立刻持久化他未与数据哭中的数据有任何关联 持久状态(Persistent):当对象与Sessi ...

  8. ajax获取数据的形象比喻,助于理解记忆

    过程 创建对象(打开浏览器) 连接服务器(输入网址) 发送请求(按下回车) 服务器接收并返回数据(显示对应的网址网站内容) 原理

  9. 以libfuse为例介绍rpm打包工具rpmbuild的使用和SPEC文件的编写

    一.rpmbuild命令的安装 yum install rpm-build 二.用法 rpmbuild -bb XXXX.spec或者rpmbuild -ba XXX.tar.gz 三.目录概述 rp ...

  10. Webpack学习笔记一:What is webpack

      #,Loaders干嘛的,webpack can only process JavaScript natively, but loaders are used to transform other ...