Java设计模式11:外观模式

外观模式

外观模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的外观对象进行。外观模式是一个高层次的接口,使得子系统更易于使用。

医院的例子

现代的软件系统都是比较复杂的。假如把医院比作一个子系统,按照部门职能,这个系统划分为挂号、门诊、划价、化验、收费、取药等。看病的人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事。

解决这种不便的方法便是引入外观模式,医院可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。病人只需要接触接待员,由接待员与各个部门打交道。

外观模式的结构

外观模式的结构可以这么表示:

这个图中,体现了两种角色:

1、外观角色

客户端调用这个角色的方法。此角色知晓相关的子系统的功能和责任,正常情况下,本角色会将所有从客户端发来的请求委派到响应的子系统中

2、子系统角色

可以同时有一个或多个子系统,每个子系统都不是一个单独的类,而是一个类的集合。每个子系统都可以被客户端直接调用,或者被外观角色直接调用。子系统并不知道外观角色的存在,对于子系统而言,外观仅仅是另外一个客户端而已

外观模式示例

模拟三个子系统ModuleA、ModuleB、ModuleC:

public class ModuleA
{
    public void testA()
    {
        System.out.println("调用Module中的testA方法");
    }
}
public class ModuleB
{
    public void testB()
    {
        System.out.println("调用Module中的testB方法");
    }
}
public class ModuleC
{
    public void testC()
    {
        System.out.println("调用Module中的testC方法");
    }
}

模拟一个外观对象:

public class Facade
{
    public void test()
    {
        ModuleA ma = new ModuleA();
        ma.testA();
        ModuleB mb = new ModuleB();
        mb.testB();
        ModuleC mc = new ModuleC();
        mc.testC();
    }
}

写一个客户端调用一下外观角色:

public static void main(String[] args)
{
    Facade facade = new Facade();
    facade.test();
}

运行结果很明显:

调用Module中的testA方法
调用Module中的testB方法
调用Module中的testC方法

这样,客户端不需要亲自调用子系统的A、B、C模块了,也不需要知道内部系统的实现细节,甚至不需要知道模块A、模块B、模块C的存在,只需要和Facade类交互就好了,从而更好地实现了客户端和子系统中的三个模块的解耦,让客户端更容易地使用子系统。

另外,定义一个外观类还可以有效地屏蔽内部的细节。因为子系统中有一些方法,是模块之间相互交互用的,并不需要外部调用。如果直接调用子系统的类方法,会出现一些不需要客户端知道的方法,这样既暴露了内部细节,又让客户端模迷惑。外观类就不一样了,可以只给客户端提供那些子系统给外部使用的方法。

外观模式在Java中的应用及解读

Tomcat中有很多场景都使用到了外观模式,因为Tomcat中有很多不同的组件,每个组件需要相互通信,但又不能将自己内部数据过多地暴露给其他组件。用外观模式隔离数据是个很好的方法,比如Request上使用外观模式:

比如Servlet,doGet和doPost方法,参数类型是接口HttpServletRequest和接口HttpServletResponse,那么Tomcat中传递过来的真实类型到底是什么呢?

有过对Java Web项目Debug经验的肯定会发现,在真正调用Servlet前,会经过很多Tomcat方法。反编译一下javaee.jar包就会看到,传递给Tomcat的request和response的真正类型是:

看到返回的都是一个Facade类。因为Request类中很多方法都是组件内部之间交互用的,比如setComet、setReuqestedSessionId等方法,这些方法并不对外公开,但又必须设置为public,因为还要和内部组件交互使用。最好的解决方法就是通过使用一个Facade类,屏蔽掉内部组件之间交互的方法,只提供外部程序要使用的方法。

如果不使用Facade,直接传递的是HttpServletRequest和HttpServletResponse,那么熟悉容器内部运作的开发者可以分别把ServletRequest和ServletResponse向下转型为HttpServletRequest和HttpServletResponse,这样就有安全性的问题了。

外观模式的优点

外观模式有如下几个优点:

1、松散耦合

外观模式松散了客户端和子系统的耦合关系,让子系统内部的模块能更容易扩展和维护

2、简单易用

客户端不需要了解系统内部的实现,也不需要和众多子系统内部的模块交互,只需要和外观类交互就可以了

3、更好地划分层次

通过合理使用Facade,可以帮助我们更好地划分层次。有些方法是系统对内的,有些方法是对外的,把需要暴露给外部的功能集中到Facade中,这样既方便客户端使用,也很好地隐藏了内部的细节

时间: 2024-10-07 17:09:53

Java设计模式11:外观模式的相关文章

C#设计模式(11)——外观模式(Facade Pattern)

一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 "门面"模式.下面就具体介绍下外观模式. 二.外观模式的详细介绍 2.1 定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内

java设计模式之外观模式(门面模式)

针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下. 一.概念介绍 外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计模式属于结构性模式.为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用. 二.角色及使用场景 简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用.这个模式中,设计到3个角色. 1).门面角色:外观模式的核心.它被客户角色调用,它熟悉子系统的功

设计模式-11 外观模式(结构型模式)

一  外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口. 关键代码:在客户端和复杂系统之间再加一层,这一次将调用顺序.依赖关系等处理好. 使用场景: JAVA 的三层开发模式 1.为复杂的模块或子系统提供外界访问的模块. 2.子系统相对独立. 3.预防低水平人员带来的风险. 类图

【JAVA设计模式】外观模式(Facade Pattern)

一  定义 为子系统中的一组接口提供一个一致的界面.Facade模式定义了一个高层的接口,这个接口使得这一子系统更加easy使用. 二  案例 一个子系统中拥有3个模块.每一个模块中都有3个方法.当中一个为client调用方法,其它两个则为各子模块间互相调用方法.此时有例如以下需求,client为完毕功能.须要组合3个模块中的方法才干实现功能. 三  未使用模式情况 /** * @Description A模块 * @author jerry * @date 2016年4月11日下午2:16:0

Java 设计模式:外观模式Facade

Facade 外观模式 外观模式----为子系统的一组接口提供一个统一的界面,此模式定义了一个更高层的接口,这一接口使得子系统更容易使用. 借用<大话设计模式>中的例子:市场上有N多只股票,当股民想要买股票时为了最大化自己的收益需要考察市面上很多种类的股票,然后根据自己的判断选取几只股票组合购买(这种场景下每一只股票都是可以单独购买的,用户需要考察.选取一组股票来一起购买).而有的用户直接购买基金,基金的作用是帮用户选取几只股票来组合购买,用户不用自己去选取多只股票. 在这个场景下:单独的购买

JAVA设计模式之外观模式

外观模式:外观模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用.即当子系统复杂或者繁锁时,我们为子系统提供一个接口,其它程序或者对象就通过这个接口与此子系统联系.接口可以是类或方法等.这样就简化了子系统的使用. 简单例子: 1 public interface Camera 2 { 3 public void setPosition(); 4 public void setShutter(); 5 public void setAperture

设计模式——11.外观模式

1. 模式动机 2. 模式定义 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.外观模式又称为门面模式,它是一种对象结构型模式. 3. 模式结构 外观模式包含如下角色: Facade: 外观角色 SubSystem:子系统角色 4. 时序图 5. 代码分析 #include <iostream> #include "Facade.h&

Java设计模式之外观模式(facade)

随着项目的不断壮大,在controller层会注入数量庞大的service服务,为了降低类与类之间的耦合,提出外观模式,在实际开发中,在原有的层级上添加facade层,在编码过程中, 使facade层作为服务的统一入口,然后再由facede调用其他服务层代码,使得代码结构更清晰. 原文地址:https://www.cnblogs.com/zuok9527/p/11993925.html

浅谈JAVA设计模式之——外观模式

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45568655 一.概述 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.适用性 1.当你要为一个复杂子系统提供一个简单接口时.子系统往往因为不断演化而变得越来越 复杂.大多数模式使用时都会产生更多更小的类.这使得子系统更具可重用性,也更容 易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困

java设计模式_外观模式

package com.wangbiao.design.facade; /**  *   * @Title: Client.java  * @Package com.wangbiao.design.facade  * @Description: TODO   * @author wangbiao     * @date 2014-9-20 下午03:56:08   * @version V1.0  */ public class Client {     public static void m