Java设计模式(四) Facade(门面)模式及Tomcat引申

基本概念

Facade的概念

为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。

  • 我们需要以一种比原有方式更简单直接的办法与系统交互,对于讨论的复杂系统我们只有针对性地使用它的一个子集
  • 因为Facade模式可以封装多个子系统,可以减少客户必须处理的对象的数量
  • 要求一个子系统的外部与内部的通信必须通过一个统一的对象进行。也就是说Facade对象是外界对于子系统的唯一通道,可以用来整合内部杂乱无章的子系统,不管是否败絮其中,都能做到金玉其外

Facade模式的角色分工

  • Facade门面对象:

    • 此角色知晓子系统的所有功能和责任
    • 一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去,也就是该角色没有实际的业务逻辑,只是一个委托类
    • 门面对象一般不参与子系统内的业务逻辑的实现。(只提供一个访问子系统的一个路径而已)
    • 作为一个对外的接口,在系统投入运行后,它是不应该被修改的,能够隐藏封装子系统。

    封装子系统的意义:

    • 跟踪系统的使用情况:通过强制所有对系统的访问都必须经过Facade,可以很容易地监视系统的使用情况
    • 改换系统:未来可能需要改换系统。通过将原系统作为Facade类的一个私有成员,可以最省力地切换到新系统
  • Sub Systems子系统角色:
    • 是一个类的集合,但彼此之间可以相互独立,系统之间不存在相互依赖
    • 不知道门面对象的存在。
  • 例讲Facade

    比如我们平时在使用电脑时,桌面上的文件的快捷方式(或者是一个执行文件),我们需要做的操作只是打开和关闭,通常情况下完全不需要考虑用什么打开啊,设置什么参数啊,关闭的时候应该如何销毁资源才能保证程序的数据能够不造成损失….这个可执行文件就可以看做是一个门面。因为它极大地简化了我们的操作,而且我们可以完全忽略和子系统之间的交互,而简单地认为我是在和一个完整的系统进行交互。

    下面提供一个打开文件操作的实现来说明一下,门面模式到底是个什么样:

    • Sub Systems:
    class OpenWord{
        boolean isOpen;
        String name = "Viewer";
    
        OpenWord(){
            isOpen = false;
        }
        void open(){
            System.out.println("The " + name + " is opening....");
            isOpen = true;
        }
    
        void stop(){
            System.out.println("The " + name + " is closing....");
            isOpen = false;
        }
    }
    
    class PrepareFileSystem{
        boolean isOpen;
        String name = "FileSystem";
    
        PrepareFileSystem(){
            isOpen = false;
        }
        void open1(){
            System.out.println("The " + name + " is opening....");
            isOpen = true;
        }
    
        void stop1(){
            System.out.println("The " + name + " is closing....");
            isOpen = false;
        }
    }
    
    class OperateFile{
    
        void showFile ( String name ){
            System.out.println("Show the content of the file: " + name);
        }
    }

    上述都是为了实现Facade,所以不用太在意,当作提供功能的接口类即可。

    • Facade门面对象
    public class OpenFileFacade {
    
        //必须是私有成员,否则会将子系统暴露给外部
        private OpenWord openWord = new OpenWord();
        private PrepareFileSystem prepareFileSystem = new PrepareFileSystem();
        private OperateFile operateFile = new OperateFile();
    
        //只是提供一条访问路径,不实现业务逻辑
        public void openFile ( String name ){
            prepareFileSystem.open1();
            openWord.open();
            operateFile.showFile( name );
        }
    
        public void closeFile ( String name ){
            openWord.stop();
            prepareFileSystem.stop1();
        }
    
        public static void main ( String [] args ){
            OpenFileFacade a = new OpenFileFacade();
            a.openFile("cookBook");
            a.closeFile("cookBook");
        }
    
    }

    Facade应用场景

    • 为一个复杂的模块或子系统提供一个共外界访问的接口
    • 子系统相对独立,外界对子系统的访问只要黑箱操作即可。
    • 预防低水平人员带来的风险扩散(解决项目中开发人员的水平差距的问题)
      • 降低了个人代码质量对整个项目的影响的风险,一般的做法是画地为牢,只能在指定的子系统中的开发,然后再提供门面接口进行访问。
      • 可以针对同一套子系统实现不同的门面类,来方便不同开发者对于子系统的使用,降低接口交流的成本和风险

    Tomcat中门面模式的使用

    • HttpRequest和HttpResponse都实现了自己的Facade类:

      • HttpRequestFacade
      • HttpResponseFacade
    • 我们以HttpRequestFacade为例,通过它收集的访问都委派给了HttpRequest,通常被封装的对象都设为Private或者Protected,以防止在Facade中直接访问。
    时间: 2024-08-27 12:51:36

    Java设计模式(四) Facade(门面)模式及Tomcat引申的相关文章

    Java设计模式(五) Observer(观察者)模式及Tomcat引申

    基本概念 Observer 观察者模式(Observer Pattern)又称为发布订阅模式(Publish/subscribe) 定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并且自动更新 根据单一职责原则,每个类的职责是单一的,我们可以通过触发机制,形成一个触发链,把各个单一的职责串联成真实世界中的复杂的逻辑关系. 观察者模式的角色分工(JDK中提供了抽象接口的定义): Subject被观察者: 抽象类型,定义被观察者必须实现的职责,动态地增加和

    Java设计模式(六) Command(命令模式)及Tomcat引申

    基本概念 Command 命令模式是一个高内聚的模式(满足单一职责原则) 概念:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 命令模式在项目中频繁使用,封装性和拓展性都有很好的保障 Command模式中的角色分工: Client:创建一个命令并决定接受者 Command:命令接口,定义一个抽象方法 Concrete Command:具体命令,负责调用接受者的相关操作 Invoker:请求者,负责调用命令对象执行请求 R

    Java设计模式(四) 之 模板方法模式

    源码均以JDK1.8作为参考 1.定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的机构即可重定义该算法的某些特定步骤. 2.解析: 通用类图: 类图解析: 模板方法模式非常简单,仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式. 2.1.抽象模板(AbstractClass) 主要定义了模板中一些基本操作(方法),它的方法分为两类: 基本方法: 基本方法也叫基本操作,是由子类实现的方法,并且被模板方法被调用. 模板方法: 可以由一个或几个,一般

    Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)

    1     概念定义 1.1   定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2   类型 创建类模式 2     原理特征 2.1   类图 2.2   优点 1)封装性良好,代码结构清晰 2)可拓展性高,只需修改一下工厂方法或拓展一个工厂类 3)屏蔽产品类,调用者不需要关心产品类的变化 4)高度解耦,高层模块只需知道产品抽象类,无需关注实现 2.3   缺点 代码复杂度增加 3     .应用拓展 3.1   应用场景 1)    

    Java 设计模式(八) Proxy(代理)模式及Spring引申

    Proxy 基本概念 代理模式(Proxy pattern)是一种使用率非常高的模式: 为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫作委托模式,它是一项基本设计技巧 Proxy中的角色 Subject(抽象主题类):既可以是抽象类也可以是抽象的接口 RealSubject(具体的主题角色):是被委托角色或者说是被代理角色 Proxy(代理主题角色):是委托类或者代理类: 它负责对真实的角色的应用 把Subject定义的方法限制委托给RealSubject实现 在RealSubjec

    Java 设计模式(九) Strategy(策略)模式及Spring引申

    Strategy 基本概念 策略模式(Strategy Pattern): 定义一组算法,将每个算法都封装起来,并且他们之间可以互换. 使用面向对象的继承和多态机制实现 Strategy中的角色: Context封装角色: 它叫做上下文角色,起承上启下的封装作用,屏蔽高层模块对策略.算法的直接访问,封装可能存在的变化. Strategy抽象策略角色: 策略,算法家族的抽象,通常为接口,定义每个策略或算法的必须具有的算法和属性. Concrete Strategy具体策略角色: 实现抽象策略中的操

    Java设计模式之接口型模式总结

    摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6508967.html 之前认真学习了Java设计模式中的四大接口型模式,分别为:适配器模式(Adapter).外观模式(Facade).合成模式(Composite).桥接模式(Bridge). 1.在此处再温习一下四种设计模式: (1)适配器模式: 我们能够访问的类中不存在我们要访问的内容时,就可以使用这个适配器模式,当然就类而言,其实不存在什么不能被访问,这里的不能访问都是人

    Java设计模式之工厂方法模式(转) 实现是抽象工厂?

    Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章]          一 .工厂方法(Factory Method)模式 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色

    java设计模式4--建造者模式(Builder)

    本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 概述 当系统准备为用户提供一个内部结构复杂的对象时,就可以使用生成器模式,使用该模式可以逐步地构造对象,使得对象的创建更具弹性.生成器模式的关键是将一个包含有多个组件对象的创建分成若干个步骤,并将这些步骤封装在一个称作生成器的接口中. 适用性 1.当创建复杂