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中直接访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值