openfire源码研究笔记:对设计模式及原则的学习
来源:互联网 发布:网络课程验收 编辑:程序博客网 时间:2024/05/20 13:10
一.拦截器的实现
地点: package org.jivesoftware.openfire.interceptor-public class InterceptorManager
作用: 在每个packet处理之前先使用拦截器Manager里面的interceptors处理
解释: 这个拦截器Manager是一个List,里面包含多个拦截器的实例,如果需要多加拦截器则只需往里面add就行了.符合 开闭原则,非常轻松的就能扩展功能.
结果: 所以openfire支持自定义插件,它的每个插件就是一个拦截器.
启示: 一个良好的架构必定是能够轻松扩展的,使用这种拦截器的方式能够让我们的系统轻松扩展功能.
我觉得这个就是aop的实现,并且这种以Manager管理多个拦截器的形式无疑是更好的
系统可以在两个地方拦截:
1.进入的时候(编码,身份验证,加密解密等)
2.真正逻辑代码处理的时候(打印日志,事务增强,读取缓存等)
图示:InterceptorManager
图示:逻辑代码处理之前调用拦截器处理:
———————————————————罪恶的分割线————————————————————
二.CacheFactoryStrategy,缓存工厂策略模式
策略模式:
作用: 没有设置集群的情况下就用DefaultLocalCacheStategy来创建cache,当设置了集群则自动使用ClusteredCacheFactory来创建
实现:
-声明:
<span style="font-size:18px;"> private static CacheFactoryStrategy cacheFactoryStrategy = new DefaultLocalCacheStrategy(); private static CacheFactoryStrategy localCacheFactoryStrategy; private static CacheFactoryStrategy clusteredCacheFactoryStrategy;</span>
<pre name="code" class="java">@SuppressWarnings("unchecked")
public static synchronized <T extends Cache> T createCache(String name) {
T cache = (T) caches.get(name);
if (cache != null) {
return cache;
}
cache = (T) cacheFactoryStrategy.createCache(name);
log.info("Created cache [" + cacheFactoryStrategy.getClass().getName() + "] for " + name);
return wrapCache(cache, name);
}
<span style="font-size:18px;"> public static void stopClustering() { // Stop the cluster clusteredCacheFactoryStrategy.stopCluster(); clusteredCacheFactoryStrategy = null; // Set the strategy to local cacheFactoryStrategy = localCacheFactoryStrategy; } /** * Notification message indicating that this JVM has joined a cluster. */ @SuppressWarnings("unchecked")public static synchronized void joinedCluster() { cacheFactoryStrategy = clusteredCacheFactoryStrategy; // Loop through local caches and switch them to clustered cache (purge content) for (Cache cache : getAllCaches()) { // skip local-only caches if (localOnly.contains(cache.getName())) continue; CacheWrapper cacheWrapper = ((CacheWrapper) cache); Cache clusteredCache = cacheFactoryStrategy.createCache(cacheWrapper.getName()); cacheWrapper.setWrappedCache(clusteredCache); } clusteringStarting = false; clusteringStarted = true; log.info("Clustering started; cache migration complete"); }</span>
解释:
声明的时候就赋值了Default,然后初始化的时候把localCacheFactoryStrategy也实例化成了Default,
然后initialize()的时候使用了localCache.即默认使用的这个
如果发现集群加入,则cacheFactoryStrtegy = clusterCacheFactoryStrategy.则之后创建cache都是使用的集群的创建方法.
启示: 策略模式不是多实例实现,而是根据不同的条件选择不同的实现方法实现.
有点类似于状态模式(状态模式是不是添加个listener监听到状态变化然后就赋值新的实例?)
但是它是在初始化的时候就决定的.只一次.从这方面来讲,这里算是半个策略半个状态,因为集群启动是在运行过程中而不是初始化,
补充:策略模式还有个重要的角色 环境Context ,这个Context用来实例化接口,然后能够对实例进行增强
链接:http://zhanche2011.iteye.com/blog/1169948
- openfire源码研究笔记:对设计模式及原则的学习
- 【学习笔记】对OOP思想及基本设计原则的理解
- 设计原则(设计模式学习笔记)
- 【设计模式】学习笔记之设计原则
- 设计模式学习笔记---设计原则
- 设计模式学习笔记(一):设计模式与设计原则
- 设计模式学习笔记:六大原则
- Java学习笔记之设计模式原则
- 设计模式学习笔记(一)六大原则
- 对设计模式六大原则的理解
- 《Android源码设计模式与实战》单一原则学习笔记一
- 《Android源码设计模式与实战》稳健性开闭原则学习笔记二
- 学习设计模式原则之依赖倒置原则,代码笔记
- 设计模式学习笔记(Java篇)之设计模式原则
- 设计模式学习笔记---1.设计模式六大原则
- 设计模式学习笔记(一)设计模式六大原则
- 设计模式学习笔记——设计模式的六大原则
- 设计模式原则笔记
- div的text-align属性的使用
- 转个苹果公司联系邮箱大全
- Android数据库安全解决方案,使用SQLCipher进行加解密
- 全功能DB数据库管理工具,超赞,完全支持所有主流数据库
- OCR备份后,我们看看里面的内容
- openfire源码研究笔记:对设计模式及原则的学习
- android登陆获取验证码倒计时功能的实现(CountDownTimer)
- 2016年 IT 趋势大预测!
- The content of the adapter has changed but ListView did not receive a notification异常处理
- 手写的Android命名规范
- Jmeter:图形界面压力测试工具
- Linux常用操作-压缩与解压缩
- 《从零开始学Swift》学习笔记(Day 59)——代码排版
- 编程习惯-函数无参数用void填充