门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面对(Facade)象进行。

迪米特法则:只与你直接的朋友们通信。

此设计模式需要一个设计不是很好的系统进行改造来进行对比Facade倒底做些什么。

以下为一个设计不是很好的系统:

可以看出,Client对象需要引用到所有的Camera,Light,Sensor,Alarm对象。Client必须对保安系统全知全能,这是一个不利于复用的做法,源代码如下所示:

//Client.java
package com.javapatterns.facade.security;
 
public class Client
{
    static private Camera camera1 = new Camera();
    static private Camera camera2 = new Camera();
    static private Light light1 = new Light();
    static private Light light2 = new Light();
    static private Light light3 = new Light();
    static private Sensor sensor = new Sensor();
    static private Alarm alarm = new Alarm();
 
    public static void main(String[] args)
    {
        camera1.turnOn();
        camera2.turnOn();
 
        light1.turnOn();
        light2.turnOn();
        light3.turnOn();
 
        sensor.activate();
        alarm.activate();
    }
 
}
 
 
//Camera.java
package com.javapatterns.facade.security;
 
public class Camera
{
    public void turnOn()
    {
        System.out.println("Turning on the camera.");
    }
 
    public void turnOff()
    {
        System.out.println("Turning off the camera.");
    }
 
    public void rotate(int degrees)
    {
        System.out.println("rotating the camera by " + degrees + " degrees.");
    }
}
 
 
 
//Light.java
package com.javapatterns.facade.security;
 
public class Light
{
    public void turnOn()
    {
        System.out.println("Turning on the Light.");
    }
 
    public void turnOff()
    {
        System.out.println("Turning off the Light.");
    }
 
    public void changeBulb()
    {
        System.out.println("changing the light-bulb.");
    }
}
 
 
//Sensor.java
package com.javapatterns.facade.security;
 
public class Sensor
{
    public void activate()
    {
        System.out.println("Activating the sensor.");
    }
 
    public void deactivate()
    {
        System.out.println("Deactivating the sensor.");
    }
 
    public void trigger()
    {
        System.out.println("The sensor has been triggered.");
    }
}
 
 
 
//Alarm.java
package com.javapatterns.facade.security;
 
public class Alarm
{
    public void activate()
    {
        System.out.println("Activating the alarm.");
    }
 
    public void deactivate()
    {
        System.out.println("Deactivating the alarm.");
    }
 
    public void ring()
    {
        System.out.println("Ringing the alarm.");
    }
 
    public void stopRing()
    {
        System.out.println("Ringing stopped.");
    }
}
 
 

一个合情合理的改进方法就是准备一个系统的控制台,作为安保系统的用户界面。用户只需要操作这个简化的界面就可以操控所有的内部仪器,这实际上就是门面模式的用意。

如下所示的设计图:

可以看出,门面SecurityFacade对象承担了与保安系统内部各个对象打交道的任务,而客户对象只需要与门面对象打交道即可。

这是客户端与保安系统之间的一个门户,使得客户端与子系统之间的关系变得简单和易于管理。

//Client.java
package com.javapatterns.facade.securityfacade;
 
public class Client
{
    private static SecurityFacade security = new SecurityFacade();
 
    public static void main(String[] args)
    {
        security.activate();
    }
}
 
 
//SecurityFacade.java
package com.javapatterns.facade.securityfacade;
 
public class SecurityFacade
{
    private Camera camera1 = new Camera();
    private Camera camera2 = new Camera();
    private Light light1 = new Light();
    private Light light2 = new Light();
    private Light light3 = new Light();
    private Sensor sensor = new Sensor();
    private Alarm 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();
    }
 
}
 
 
//Camera.java
package com.javapatterns.facade.securityfacade;
 
public class Camera
{
    public void turnOn()
    {
        System.out.println("Turning on the camera.");
    }
 
    public void turnOff()
    {
        System.out.println("Turning off the camera.");
    }
 
    public void rotate(int degrees)
    {
        System.out.println("Rotating the camera by " + degrees + " degrees.");
    }
}
 
//Light.java
package com.javapatterns.facade.securityfacade;
 
public class Light
{
    public void turnOn()
    {
        System.out.println("Turning on the light.");
    }
 
    public void turnOff()
    {
        System.out.println("Turning off the light.");
    }
 
    public void changeBulb()
    {
        System.out.println("Changing the light-bulb.");
    }
}
 
//Sensor.java
package com.javapatterns.facade.securityfacade;
 
public class Sensor
{
    public void activate()
    {
        System.out.println("Activating on the sensor.");
    }
 
    public void deactivate()
    {
        System.out.println("Deactivating on the sensor.");
    }
 
    public void trigger()
    {
        System.out.println("The sensor has been triggered.");
    }
}
 
//Alarm.java
package com.javapatterns.facade.securityfacade;
 
public class Alarm
{
    public void activate()
    {
        System.out.println("Activating the alarm.");
    }
 
    public void deactivate()
    {
        System.out.println("Deactivating the alarm.");
    }
 
    public void ring()
    {
        System.out.println("Ring the alarm.");
    }
 
    public void stopRing()
    {
        System.out.println("Stop the alarm.");
    }
}
 
 

Java设计模式11:Facade相关推荐

  1. Java面试题:Java设计模式11道常见面试题

    想要找到一份好的工作,面试是少不了的,本文收录了一些Java基础面试题,学习没有捷径,希望大家都能少走一些弯路,2021Java面试题赶快学习起来吧. Java基础面试题, 请列出JDK中几种最常用的 ...

  2. Java 设计模式之Facade门面模式

    场景:当外界某个对象与某个系统内的多个组件都要进行交互时,这个系统可以对外提供一个统一的接口,与外界这个对象对接,这样可以对外隐藏系统内部的复杂性,接口内部调用各个组件功能. 实现:定义一个Facad ...

  3. java设计模式之Facade模式

    介绍外观模式之前,首先让我们来看下面的例子: 假设我们现有一个对外接口FacadeService,里面有一个对外的方法a(): public interface FacadeService {publ ...

  4. facade java_Java设计模式之Facade模式

    Java设计模式之Facade模式  GOF<设计模式>一书对Facade模式是这样描述的: 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个更高层的接口,使子系统更加容易 ...

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

    Java设计模式 -11- 外观模式(Facade模式) 前言 外观模式的定义与特点 优点: 缺点: 外观模式的结构与实现 1. 模式的结构 2. 模式的实现 外观模式的应用实例 外观模式的应用场景 ...

  6. 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)

    如何让孩子爱上设计模式 --11.外观模式(Facade Pattern) 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧:       分别是瑞雯和 ...

  7. 【java设计模式】-00目录

    开篇 [java设计模式]-01设计模式简介 创建型模式: [java设计模式]-02工厂模式(Factory Pattern) [java设计模式]-03抽象工厂模式(Abstract Factor ...

  8. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  9. Java设计模式(7)装饰模式(Decorator模式)

    Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...

最新文章

  1. hadoop1.2.1伪分布模式安装教程
  2. 10 在Spring Cloud中使用Hystrix
  3. NYOJ 372 巧克力
  4. 2、垃圾回收算法(标记清除算法、复制算法、标记整理算法和分代收集算法),各种垃圾收集器讲解(学习笔记)
  5. 设计模式系列之单例模式(java)
  6. 漫画:如何用Zookeeper实现分布式锁?
  7. 学习笔记day5:inline inline-block block区别
  8. 硬件基础知识(12)---为什么我的处理器这么耗电?原因不只是一个小小的限流电阻.
  9. Java和C语言学习那个比较好?
  10. 做技术的你,如果别人找你创业,该怎么办?
  11. 基于SSM医院预约管理系统
  12. python 图像检索_深度学习图像检索
  13. CC2430DMA学习
  14. 【EXLIBRIS】墙上的坏人
  15. RPL(9):RFC6550翻译(9)---安全机制
  16. 4G套餐用户挺住了,运营商比你们急,会给优惠的低价流量
  17. 移动硬盘读不出来,无法识别的6种修复方法
  18. python 模拟登录获取cookie_Python获取新浪微博cookie模拟登录
  19. Google Open Images Dataset V4 百度网盘地址。
  20. 高等数学同济第七版下册期中复习提纲思维导图知识体系

热门文章

  1. Spring中监听器的详解
  2. Keil 中的预处理命令const
  3. ConcurrentProgramming:volatile/构造方法溢出/禁止重排序
  4. centos7搭建单机kafka集群
  5. 提高.NET编程水平的50个要点(转载)
  6. Docker-images
  7. Mac安装MySQLWorkbench
  8. [Winform]只允许运行一个exe,如果已运行则将窗口置前
  9. Stack Overflow: The Architecture - 2016 Edition(Translation)
  10. 多线程编程-工具篇-BlockingQueue