外观模式的应用之StandardSession和StandardSessionFacade看法

来源:互联网 发布:导购网源码 编辑:程序博客网 时间:2024/05/13 07:20

最进看Session看到一个跟“外观模式”还有“访客模式”相关的东西,所以这里做个记录分享下。以下全是自己的理解,有不妥之处还请指出,共同学习进步。
书面式的介绍不说,自己去看其他的定义
外观模式:就是为了封闭子系统内部的,但是又需要向外部开放一些东西,就可以采用这个。
访客模式:为了维护类的单一职责原则,但是又想做一些事情,就通过双重派分的方式让其他类代替自己去做。
双重派分:就是自己作为参数传入自己类内部变量的一个函数,然后在类内部变量对应的类的函数中做自己的处理。有借刀杀人的意味。

下面是对StandardSession的理解,首先看下对应的网上摘录的类图
这里写图片描述

我们带着几个问题来看:
1.为什么StandardSession要搞一个外观模式?
答:因为他的功能实现了session,但是其中Session和Serializable接口的方法是内部处理的东西,无需对外界开放。而外观模式可以屏蔽不想让外界看到的东西。

2.为什么不把那些不让外界查看的东西设置为private呢?
答:因为接口中的函数必须为public,因此他实现的方法域必须为public。

3.外观模式怎么实现屏蔽的呢?
答:首先确定要对外开放的函数是哪些接口,确定HttpSession之后,则在StandardSession内部存放一个外观类,在对外获取Session的时候将StandardSessionFacade返回给外界的处理者,如代码

/**     * Return the HttpSession for which this object     * is the facade.     */    public HttpSession getSession() {        if (facade == null){            if (SecurityUtil.isPackageProtectionEnabled()){                final StandardSession fsession = this;                facade = AccessController.doPrivileged(                        new PrivilegedAction(){                    public StandardSessionFacade run(){                        return new StandardSessionFacade(fsession);                    }                });            } else {                facade = new StandardSessionFacade(this);            }        }        return (facade);    }

而外界的处理怎么能够用到StandardSession的处理呢,其中StandardSessionFacade跟StandardSession一样继承自HttpSession,同时我们查看StandardSessionFacade源码会发现里面有一个指向HttpSession的对象session,根据里氏替换原则其实就是StandardSession对象,以及下面的处理都是StandardSession的处理,这样就实现了StandardSession向外界需要看到的东西,如下

public class StandardSessionFacade    implements HttpSession {    // ----------------------------------------------------------- Constructors    /**     * Construct a new session facade.     */    public StandardSessionFacade(StandardSession session) {        super();        this.session = session;    }    /**     * Construct a new session facade.     */    public StandardSessionFacade(HttpSession session) {        super();        this.session = session;    }    // ----------------------------------------------------- Instance Variables    /**     * Wrapped session object.     */    private HttpSession session = null;    // ---------------------------------------------------- HttpSession Methods    public long getCreationTime() {        return session.getCreationTime();    }    public String getId() {        return session.getId();    }    public long getLastAccessedTime() {        return session.getLastAccessedTime();    }    /**     * @deprecated     */    public Object getValue(String name) {        return session.getAttribute(name);    }    //下面所有的函数都是用内部session来进行处理,这里不再列举}

通过这个我们可以感觉到其中StandardSession的getSession()其实就是用的双重派分的方式,让他人代替自己处理一些自己本身处理但是又不想处理的一些东西。

看到这里感觉到以后如果设计系统的时候就可以参考这个例子,通过外观模式和双重派分的方式来实现。

0 0