外观模式的应用之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()其实就是用的双重派分的方式,让他人代替自己处理一些自己本身处理但是又不想处理的一些东西。
看到这里感觉到以后如果设计系统的时候就可以参考这个例子,通过外观模式和双重派分的方式来实现。
- 外观模式的应用之StandardSession和StandardSessionFacade看法
- 外观模式的应用
- 外观模式和适配器模式的区别
- android应用开发设计模式之外观模式
- android应用开发设计模式之外观模式
- 关于软件架构、设计模式和应用框架的一点看法
- 设计模式之适配器模式和外观模式
- 设计模式之适配器模式和外观模式
- 统一的编程接口之外观模式
- 设计模式的应用场景(6)--外观模式
- 设计模式之外观
- 设计模式之外观
- 设计模式 之 外观
- java 之 外观模式
- GOF之外观模式
- 设计模式之外观
- learning之外观模式
- java之外观模式
- python 的import机制
- Git常用命令
- 基础篇-对于frame的理解
- [动画]属性动画ObjectAnimator及ValueAnimator运用分析
- ansible小结(十 二)磁盘使用率筛选
- 外观模式的应用之StandardSession和StandardSessionFacade看法
- poj - problem 3070 Fibonacci 【矩阵 +快速幂】
- 设计模式-工厂方法模式
- jquery选择器
- c#实现图像图像卷积与滤波——高斯平滑
- BFS,DFS等搜索题目总结
- ubuntu 开机报系统错误解决办法
- shell script编程应用—写网页/报告生成器
- C++ 读取一行带有空格的字符串