[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.概述 自己卖了一辆越野自行车,但毕竟不是自己定制的,买回来之后可能需要更改一下脚蹬,座皮,里程计数器或者刹车系统,假如将自行车看做一个整体系统,对我们而言使用的是自行车,然后我们对自己车构件的修改 ...
随机推荐
- sqlserver如何创建镜像图文教程(转)
由于工作中需要做SQL的镜像异地备份,以前都没有研究过,百度了一个文章记录下,方便以后查询 转载地址:http://jingyan.baidu.com/article/d5c4b52b20843fda ...
- silicon labs 代理商
http://www.silabs.com/buysample/pages/contact-sales.aspx?SearchLocation=China Silicon Labs A ...
- 找不到mysql.sock,mysql.sock丢失问题解决方法
Can 't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock '(2) "; 是你的mysql ...
- NOIP复习赛20161117
题目链接:http://files.cnblogs.com/files/candy99/%E9%A2%98%E7%9B%AE1117.pdf A n个等比数列求和公式(都感觉数列忘光了) %1e9+7 ...
- Oracle 中的分析函数
Oracle常用分析函数介绍(排名函数+窗口函数) 2014年11月30日 ⁄ 数据库 ⁄ 共 3903字 ⁄ 暂无评论 ⁄ 阅读 7,772 次 评级函数 常见评级函数如下: RANK():返回数据 ...
- Java中的instanceof关键字
instanceof是Java的一个二元操作符,和==,>,<是同一类东东.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回boo ...
- JSP中ResultSet的方法
1,如何获得ResultSet的结构 ResultSetMetaData rsmd=rs.getMetaData();cn=rsmd.getColumnCount();for(int ik=1;ik& ...
- Vue系列:在vux的popup组件中使用百度地图遇到显示不全的问题
问题描述: 将百度地图封装成一个独立的组件BMapComponent,具体见 Vue系列:如何将百度地图包装成Vue的组件(http://www.cnblogs.com/strinkbug/p/576 ...
- LintCode-Longest Increasing Subsequence
Given a sequence of integers, find the longest increasing subsequence (LIS). You code should return ...
- 关于DOS与cmd(windows系统)
dos是计算机的最初期的操作系统,对电脑操作必须输入各种dos命令窗口,可以理解成运行计算机机器内部语言,知道编程吗?其实早期dos命令操作系统就是运行计算机内部的编程命令,因此操作人员都必须具有一定 ...