登录
注册
搜索
帮助
会员
界面
简洁版本
在线
bugsbox技术论坛
软件开发技术
设计模式
设计模式(15)-Facade Pattern
帖子标题
BugsBox原创
BugsBox C#代码生成器
电脑问题
联想Y430,450,G430闪屏信息收集
软件问题
综合问题
算法学习
数据结构
正则表达式
编程语言
F#
C#
VB.NET
JAVA
JavaScript
HTML/DHTML/XHTML
C&C++
软件开发技术
JSP
JSF
Asp.net
J2ME
Windows Form
Asp
Web 2.0
JavaScript高级技术
文档技术
建模工具
设计模式
php
数据库
Sql Server
Access
Oracle
MySql
其他交流
论坛意见
闲聊人生
无厘灌水
1
/ 1 页
1
跳转
页
查看:
300
设计模式(15)-Facade Pattern
hutaoshu
hutaoshu
组别:
管理员
性别:
来自:
积分:
197
帖子:
192
注册:
2009-03-31
2009-07-16 11:28
|
只看楼主
树型
|
收藏
|
小
中
大
1
设计模式(15)-Facade Pattern
一、 门面(Facade)模式外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。
医院的例子
用一个例子进行说明,如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。
首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴款,才能到化验部门做化验。化验后,再回到门诊室。
解决这种不便的方法便是引进门面模式。可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员负责与医院的各个部门打交道。
什么是门面模式
门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
就如同医院的接待员一样,门面模式的门面类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与门面对象打交道,而不需要与子系统内部的很多对象打交道。
二、 门面模式的结构门面模式是对象的结构模式。门面模式没有一个一般化的类图描述,下图演示了一个门面模式的示意性对象图:
在这个对象图中,出现了两个角色:
门面(Facade)角色:
客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
子系统(subsystem)角色:
可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。
三、 门面模式的实现
一个系统可以有几个门面类
【GOF】的书中指出:在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。当然这并不意味着在整个系统里只能有一个门面类,而仅仅是说对每一个子系统只有一个门面类。或者说,如果一个系统有好几个子系统的话,每一个子系统有一个门面类,整个系统可以有数个门面类。
为子系统增加新行为
初学者往往以为通过继承一个门面类便可在子系统中加入新的行为,这是错误的。门面模式的用意是为子系统提供一个集中化和简化的沟通管道,而不能向子系统加入新的行为。
四、 在什么情况下使用门面模式
为一个复杂子系统提供一个简单接口
提高子系统的独立性
在层次化结构中,可以使用Facade模式定义系统中每一层的入口。
五、 一个例子我们考察一个保安系统的例子,以说明门面模式的功效。一个保安系统由两个录像机、三个电灯、一个遥感器和一个警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。
不使用门面模式的设计
首先,在不使用门面模式的情况下,操作这个保安系统的操作员必须直接操作所有的这些部件。下图所示就是在不使用门面模式的情况下系统的设计图。
可以看出,Client对象需要引用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象。代码如下:
using
System;
public
class
Camera
{
public
void
TurnOn()
{
Console.WriteLine(
"
Turning on the camera.
"
);
}
public
void
TurnOff()
{
Console.WriteLine(
"
Turning off the camera.
"
);
}
public
void
Rotate(
int
degrees)
{
Console.WriteLine(
"
Rotating the camera by {0} degrees.
"
, degrees);
}
}
public
class
Light
{
public
void
TurnOff()
{
Console.WriteLine(
"
Turning on the light.
"
);
}
public
void
TurnOn()
{
Console.WriteLine(
"
Turning off the light.
"
);
}
public
void
ChangeBulb()
{
Console.WriteLine(
"
changing the light-bulb.
"
);
}
}
public
class
Sensor
{
public
void
Activate()
{
Console.WriteLine(
"
Activating the sensor.
"
);
}
public
void
Deactivate()
{
Console.WriteLine(
"
Deactivating the sensor.
"
);
}
public
void
Trigger()
{
Console.WriteLine(
"
The sensor has triggered.
"
);
}
}
public
class
Alarm
{
public
void
Activate()
{
Console.WriteLine(
"
Activating the alarm.
"
);
}
public
void
Deactivate()
{
Console.WriteLine(
"
Deactivating the alarm.
"
);
}
public
void
Ring()
{
Console.WriteLine(
"
Ringing the alarm.
"
);
}
public
void
StopRing()
{
Console.WriteLine(
"
Stop the alarm.
"
);
}
}
public
class
Client
{
private
static
Camera camera1, camera2;
private
static
Light light1, light2, light3;
private
static
Sensor sensor;
private
static
Alarm alarm;
static
Client()
{
camera1
=
new
Camera();
camera2
=
new
Camera();
light1
=
new
Light();
light2
=
new
Light();
light3
=
new
Light();
sensor
=
new
Sensor();
alarm
=
new
Alarm();
}
public
static
void
Main(
string
[] args )
{
camera1.TurnOn();
camera2.TurnOn();
light1.TurnOn();
light2.TurnOn();
light3.TurnOn();
sensor.Activate();
alarm.Activate();
}
}
六、 使用门面模式的设计一个合情合理的改进方法就是准备一个系统的控制台,作为保安系统的用户界面。如下图所示:
程序代码如下:
using
System;
public
class
Camera
{
public
void
TurnOn()
{
Console.WriteLine(
"
Turning on the camera.
"
);
}
public
void
TurnOff()
{
Console.WriteLine(
"
Turning off the camera.
"
);
}
public
void
Rotate(
int
degrees)
{
Console.WriteLine(
"
Rotating the camera by {0} degrees.
"
, degrees);
}
}
public
class
Light
{
public
void
TurnOff()
{
Console.WriteLine(
"
Turning on the light.
"
);
}
public
void
TurnOn()
{
Console.WriteLine(
"
Turning off the light.
"
);
}
public
void
ChangeBulb()
{
Console.WriteLine(
"
changing the light-bulb.
"
);
}
}
public
class
Sensor
{
public
void
Activate()
{
Console.WriteLine(
"
Activating the sensor.
"
);
}
public
void
Deactivate()
{
Console.WriteLine(
"
Deactivating the sensor.
"
);
}
public
void
Trigger()
{
Console.WriteLine(
"
The sensor has triggered.
"
);
}
}
public
class
Alarm
{
public
void
Activate()
{
Console.WriteLine(
"
Activating the alarm.
"
);
}
public
void
Deactivate()
{
Console.WriteLine(
"
Deactivating the alarm.
"
);
}
public
void
Ring()
{
Console.WriteLine(
"
Ringing the alarm.
"
);
}
public
void
StopRing()
{
Console.WriteLine(
"
Stop the alarm.
"
);
}
}
public
class
SecurityFacade
{
private
static
Camera camera1, camera2;
private
static
Light light1, light2, light3;
private
static
Sensor sensor;
private
static
Alarm alarm;
static
SecurityFacade()
{
camera1
=
new
Camera();
camera2
=
new
Camera();
light1
=
new
Light();
light2
=
new
Light();
light3
=
new
Light();
sensor
=
new
Sensor();
alarm
=
new
Alarm();
}
public
void
Activate()
{
camera1.TurnOn();
camera2.TurnOn();
light1.TurnOn();
light2.TurnOn();
light3.TurnOn();
sensor.Activate();
alarm.Activate();
}
public
void
Deactivate()
{
camera1.TurnOff();
camera2.TurnOff();
light1.TurnOff();
light2.TurnOff();
light3.TurnOff();
sensor.Deactivate();
alarm.Deactivate();
}
}
public
class
Client
{
private
static
SecurityFacade security;
public
static
void
Main(
string
[] args )
{
security
=
new
SecurityFacade();
security.Activate();
Console.WriteLine(
"
\n--------------------\n
"
);
security.Deactivate();
}
}
参考文献:
阎宏,《Java与模式》,电子工业出版社
[美]James W. Cooper,《C#设计模式》,电子工业出版社
[美]Alan Shalloway James R. Trott,《Design Patterns Explained》,中国电力出版社
[美]Robert C. Martin,《敏捷软件开发-原则、模式与实践》,清华大学出版社
[美]Don Box, Chris Sells,《.NET本质论 第1卷:公共语言运行库》,中国电力出版社
发送短消息
查看公共资料
查找该会员全部帖子
UID:
3
精华:
1
威望:
0
金钱:
40.05 元
状态:
离线
<<
上一主题
|
下一主题
>>
1
/ 1 页
1
跳转
页
论坛跳转...
BugsBox原创
BugsBox C#代码生成器
电脑问题
联想Y430,450,G430闪屏信息收集
软件问题
综合问题
算法学习
数据结构
正则表达式
编程语言
F#
F#语言基础
F#编程指南
C#
C# 参考
C# 编程指南
Linq专题
VB.NET
JAVA
JavaScript
HTML/DHTML/XHTML
C&C++
软件开发技术
JSP
SSH
JSF
sun-ri
myfaces
icefaces
richfaces
seam
Asp.net
asp.net控件开发
J2ME
Windows Form
WinForm控件开发
Asp
Web 2.0
JavaScript高级技术
Ajax
ext
jquery
prototype
文档技术
建模工具
设计模式
php
数据库
Sql Server
Access
Oracle
MySql
其他交流
论坛意见
闲聊人生
无厘灌水
我的主题
我的帖子
我的精华
帖子标题
空间日志
相册标题
作 者