门面(Facade)模式

门面(Facade)模式  也叫 外观模式。

外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得子系统更加容易使用

/*

* 门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。

  在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
*
子系统(subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。

  每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。
*/

如下代码 为

Camera Light Sensor Alarm 定义了一个 SecurityFacade 门面, 客户端只要调用 SecurityFacade  实例就能查看所有类的数据


    /// <summary>
/// 门面(Facade)模式
/// 外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。
/// </summary>
class Program
{

private static SecurityFacade security;
public static void Main(string[] args)
{
security = new SecurityFacade();
security.Activate();
Console.WriteLine("\n--------------------\n");
security.Deactivate();

Console.ReadLine();
}
}

/// <summary>
/// 子系统(subsystem)角色 相机
/// </summary>
public class Camera
{
public void TurnOn()
{
Console.WriteLine("打开 camera.");
}
public void TurnOff()
{
Console.WriteLine("关闭 camera.");
}
public void Rotate(int degrees)
{
Console.WriteLine("Rotating the camera by {0} degrees.", degrees);
}
}

/// <summary>
/// 子系统(subsystem)角色 电灯
/// </summary>
public class Light
{
public void TurnOff()
{
Console.WriteLine("打开电灯.");
}
public void TurnOn()
{
Console.WriteLine("关闭电灯.");
}
public void ChangeBulb()
{
Console.WriteLine("changing the light-bulb.");
}
}

/// <summary>
/// 子系统(subsystem)角色 感应器
/// </summary>
public class Sensor
{
public void Activate()
{
Console.WriteLine("激活传感器.");
}
public void Deactivate()
{
Console.WriteLine("注销传感器.");
}

public void Trigger()
{
Console.WriteLine("The sensor has triggered.");
}
}

/// <summary>
/// 子系统(subsystem)角色 警报器
/// </summary>
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.");
}
}

/// <summary>
/// 门面(Facade)角色
/// </summary>
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();
}

门面(Facade)模式,布布扣,bubuko.com

时间: 2024-08-24 22:10:32

门面(Facade)模式的相关文章

浅析门面(Facade)模式+容器

原文地址:http://blog.51cto.com/phpme/2342100

设计模式之五-Facade模式

Facade门面模式,也是比较常用的一种模式,其含义是为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.简单说,就是将复杂的逻辑封装起来,对外公开简单的接口,由客户程序调用. 以收发信件和警察检查实例为例 说明:邮局对外只有一个窗口,接收信件内容和邮件地址.对内调用邮件处理的4个函数.将复杂逻辑封装在邮局的里面,当需要增加警察来检查信件时,只需在邮局内增加警察检查信件的方法. 注意:将复杂逻辑封装起来,对外只有一个简单的接口. 抽

设计模式-facade模式

facade模式-门面模式 现代医院看病是一件非常麻烦的事情,按职能分,有挂号.门诊.划价.化验.收费.取药等.看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情. 如果将每一个部门都看作一个类,那么客户端类与各个类之间的调用关系就会非常的复杂.如果我们成立一个部门,专门帮我们与这些部门打交道,我们需要看病的时候,只需要找这个部门,就能够解决很多事情了.

转:Ogre源码分析之Root类、Facade模式

Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点.因为它是整个Ogre引擎的外观(Façade)类.通过Root对象来开启和停止Ogre是最简单的一种方式:当你构造构造一个Root实例的时候你就启动了整个Ogre,当析构的时候(让它停止活动或者执行delete删除它)Ogre也就关闭了. API手册中这样介绍到:Ogre::Root 类代表了客户应用程序的入口点.在这里,应用程序可以获得系统的重要的访问权,也就是获取渲染系统 ,管理配置

Facade模式

在开发时,有时已经实现了一些接口,这些接口分布在不同的类或模块中. 客户在使用时,须要使用几个接口的组合.可是并不关心这些接口在哪,怎么实现这些接口的.为了便于客户使用,给客户提供一个一致的界面.能够使用Facade模式.此模式定义了一个高层接口,使得子系统更加easy使用. Facade模式的类结构图例如以下: 事实上现例如以下: //Facade.h //Facade.h #ifndef _FACADE_H_ #define _FACADE_H_ class Subsystem1 { pub

使用Facade模式更新库存、确认订单、采取打折、确认支付、完成支付、物流配送

Facade模式对外提供了统一的接口,而隐藏了内部细节.在网上购物的场景中,当点击提交订单按钮,与此订单相关的库存.订单确认.折扣.确认支付.完成支付.物流配送等都要做相应的动作.本篇尝试使用Facade模式,把这些类似工作者单元的动作隐藏到一类中,只要点击提交订单,余下的事情一步到位: □ 关于库存 namespace ConsoleApplication1.Interfaces { public interface IInventory { void Update(int productId

Facade 模式

在软件系统开发中经常回会遇到这样的情况,你实现了一些接口(模块),而这些接口(模块)都分布在几个类中(比如 A和 B.C.D) :A中实现了一些接口,B 中实现一些接口(或者 A代表一个独立模块,B.C.D代表另一些独立模块) .然后你的客户程序员 (使用你设计的开发人员) 只有很少的要知道你的不同接口到底是在那个类中实现的,绝大多数只是想简单的组合你的 A-D的类的接口,他并不想知道这些接口在哪里实现的.这时我们就要用到Facade 模式,Facade 模式在高层提供了一个统一的接口. 1 /

Design Pattern Explain 读书笔记二—— Facade 模式

what? Provide a unified interface to a set of interfaces in a sub- system. Facade defines a higher-level interface that makes the subsystem easier to use. --GOF 给子系统中的一堆接口提供一个统一,标准的接口--更高层次的接口--这样使得子系统更易于使用. Facade模式的特点: 对应的译文: 意图: 希望简化原有系统的使用方式.需要定义

Facade模式详解--设计模式(10)

Facade模式产生原因: 老旧的code(尤其是将C的代码转成C++代码)或者即便不是老旧code,但涉及多个子系统时,除了重写全部代码(对于老旧code而言),我们还可能采用这样一种策略:重新进行类的设计,将原来分散在源码中的类/结构及方法重新组合,形成新的.统一的接口,供上层应用使用.这在某种意义上与Adapter及Proxy有类似之处,但是,Proxy(代理)注重在为Client-Subject提供一个访问的中间层,如CORBA可为应用程序提供透明访问支持,使应用程序无需去考虑平台及网络

Facade模式实现文件上传(Flash+HTML5)

一.前言 确定了渐进式增强的上传方式,接下来我们需要将上传功能从具体的业务逻辑中剥离出来,作为公共组件供业务层调用.这就要求我们必须对业务层隐藏上传细节,只暴露统一的上传API.这时候大家是不是跟我一样想到了Facade模式? 二.Facade模式实现文件上传,代码示例: /* 上传组件,IE浏览器默认flash上传,其它浏览器html5 示例: var fileUpload = new FileUpload({ container: document.getElementById("uploa