资讯专栏INFORMATION COLUMN

外观模式(Facade Pattern)

LMou / 999人阅读

摘要:深入剖析,第二章。如果给方法以默认访问权限,则只能在同一个包中访问,这个被认为是可以的,但是不最好,最优雅的方式是通过类。定义外观模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

《深入剖析Tomcat》(How Tomcat Works),第二章。

创建 RequestResponse 分别实现 ServletRequestServletResponse,然后将这两个对象传给实现了 Servlet 接口的 PrimitiveServlet 类的service方法。

下面代码中的 request 和 response 除了实现 ServletRequestServletResponse 接口中的方法,还分别自定义了 getUri 和 sendStaticResource 方法,如果将他们向上转为 ServletRequestServletResponse,那么在 PrimitiveServlet 中如果被向下转为 Request 和 Response,则可以调用 getUri 和 sendStaticResource 方法,这被认为是不安全的。

    Request request = ...
    Response response = ...
    servlet = (Servlet) myClass.newInstance();
    servlet.service((ServletRequest) request, (ServletResponse) response);

如果将 getUri 和 sendStaticResource 声明为私有,则可以防止在 servlet 中被调用,但是在其他可能被安全地调用的地方也不能用了,不可以。如果给方法以默认访问权限,则只能在同一个包中访问,这个被认为是可以的,但是不最好,最优雅的方式是通过 facade 类。

具体做法是定义 RequestFacade 和 ResponseFacade 两个类,分别实现 ServletRequest 和 ServletResponse,同时定义私有成员变量 Request 和 Response,并且方法的实现调用 Request 和 Response 的实现。然后,将 RequestFacade 和 ResponseFacade 上转为 ServletRequest 和 ServletResponse 传给 servlet 的 service 方法,这样即使在 servlet 中被下转为 RequestFacade 和 ResponseFacade,也不能访问私有成员变量对象中的方法。既用了 Request 和 Response 的实现,又能防止其中自定义的方法被不合理的访问。

类图如下:

代码:

    public class RequestFacade implements ServletRequest {
    
        private ServleLRequest request = null;
        
        public RequestFacade(Request request) {
            this.request = request;
        }
        
        /* implementation of the ServletRequest*/
        public Object getAttribute(String attribute) {
            return request.getAttribute(attribute);
        }
        
        ...
    }
    
    // ResponseFacade类似
    
    RequestFacade requestFacade = new RequestFacade(request);
    ResponseFacade responseFacade = new ResponseFacade(response);
    try {
        servlet = (Servlet) myClass.newInstance();
        servlet.service((ServletRequest) requestFacade,(ServletResponse)responseFacade);
    }

下面是Facade模式的一些内容,与上面的用法不太一样。

定义

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

以下来自维基百科

The facade pattern is typically used when:(外观模式的典型用法)

a simple interface is required to access a complex system; (需要简单的接口去访问复杂的系统)

the abstractions and implementations of a subsystem are tightly coupled;(子系统的抽象和实现是紧密耦合的)

need an entry point to each level of layered software; or(需要一个入口去访问分层软件的每一层)

a system is very complex or difficult to understand.(一个复杂的,难以理解的系统)

大话设计模式中基金与股票的例子挺好的,这幅图也很好:

下面是维基百科上的示例代码,Java版:

/* Complex parts */

class CPU {
    public void freeze() { ... }
    public void jump(long position) { ... }
    public void execute() { ... }
}

class Memory {
    public void load(long position, byte[] data) { ... }
}

class HardDrive {
    public byte[] read(long lba, int size) { ... }
}

/* Facade */

class ComputerFacade {
    private CPU processor;
    private Memory ram;
    private HardDrive hd;

    public ComputerFacade() {
        this.processor = new CPU();
        this.ram = new Memory();
        this.hd = new HardDrive();
    }

    public void start() {
        processor.freeze();
        ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
        processor.jump(BOOT_ADDRESS);
        processor.execute();
    }
}

/* Client */

class You {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}

参考:

维基百科:https://en.wikipedia.org/wiki...

大话设计模式第12章 外观模式

How Tomcat Works, 第二章

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66046.html

相关文章

  • PHP中的facade pattern外观模式

    摘要:本文来自原文链接欢迎作客我们的学习群该篇属于底层核心技术实战揭秘这一课程底层核心概念解析这一章的扩展阅读。考虑到学员们的基础差异,为了避免视频当中过于详细而连篇累牍,故将一些底层实现相关的知识点以文章形式呈现,供大家预习和随时查阅。 本文来自pilishen.com----原文链接; 欢迎作客我们的php&Laravel学习群:109256050该篇属于《Laravel底层核心技术实战...

    jaysun 评论0 收藏0
  • 一起学设计模式 - 外观模式

    摘要:适配器是将接口转换为不同接口,而外观模式是提供一个统一的接口来简化接口。 外观模式(Facade Pattern)属于结构型模式的一种,为子系统中的一组接口提供一个统一的入口,它通过引入一个外观角色来简化客户端与子系统之间的交互... 概述 外观模式是一种使用频率非常高的结构型设计模式,当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时...

    zone 评论0 收藏0
  • 外观设计模式

    摘要:外观设计模式的优点易于使用在实现形式上通常占用较小的内存。抽象的注意事项外观设计模式虽然少有劣势,但值得注意的一个问题是性能。 当我们竖起一个门面时,我们向外展示的只是一种外表,它可能隐藏着一个非同一般的事实。这也就是我们所要说的外观设计模式,这种模式为一大段的代码体提供了一个便捷的高级接口,隐藏了底层复杂的实现。这种设计模式简化代码的呈现形式,给开发人员一个API,同时也能提高代码的...

    zzbo 评论0 收藏0
  • Laravel核心解读 -- 外观模式

    摘要:外观模式的目的在于降低系统的复杂程度。在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了开闭原则。 外观模式 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模...

    zoomdong 评论0 收藏0

发表评论

0条评论

LMou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<