打字猴:1.70048482e+09
1700484820
1700484821 private boolean isReload=false;
1700484822
1700484823 //启动监视
1700484824
1700484825 public void watch(){
1700484826
1700484827 //启动一个线程,每隔15秒扫描一下文件,发现文件日期被修改,立刻通知观察者
1700484828
1700484829 super.addObserver(new Checker());
1700484830
1700484831 super.setChanged();
1700484832
1700484833 super.notifyObservers(isReload);
1700484834
1700484835 }
1700484836
1700484837 }
1700484838
1700484839 由于框架是在操作系统之上运行的,文件变化时操作系统是不会通知应用系统的,因此我们能做的就是启动一个线程监视一批文件,发现文件改变了,立刻通知相关的处理者,它虽然有时间延迟,但对于一个应用框架来说是非常有必要的,避免了重启应用才能使配置生效的情况。
1700484840
1700484841 读者可能很疑惑,这种死循环的监控方式会不会对性能产生影响,答案是不会!为什么呢?检查一个文件的时间一般是毫秒级的,相对于我们设置的运行周期(比如15秒执行一次)是一个非常微小的运行时间,对应用不会产生任何影响。大家都在使用Log4j进行日志处理,它有一个线程是每5秒检查一次日志是否满,大家觉得性能受影响了吗?基本上性能影响可以忽略不计。
1700484842
1700484843 由于Checker还要作为观察者,因此它要实现Observer接口,同时实现update方法,如代码清单38-10所示。
1700484844
1700484845 代码清单38-10 修正后的检查者
1700484846
1700484847 public class Checker implements Observer{
1700484848
1700484849 public void update(Observable arg0,Object arg1){
1700484850
1700484851 //检查是否符合条件
1700484852
1700484853 arg1=check();
1700484854
1700484855 }
1700484856
1700484857 }
1700484858
1700484859 到此为止,我们把init方法已经讲解完毕,它是在容器初始化时调用。有一个HTTP请求发送过来,容器调用我们编写的doFilter方法。仔细看一下我们的代码,其中有这样一句话:Chain.doFilter(req,res),这句话是什么意思呢?是说让后续的过滤器先运行,等它们运行完毕后该过滤器再运行,应该想到这是一个责任链模式,它的类型是FilterChain。Servlet容器把所有的过滤器组合在一起形成了一个过滤器链,它是怎么做到的呢?容器启动的时候,把所有的过滤器都初始化完毕,然户根据它们在web.xml中的配置顺序,从上向下组装一个过滤器链。注意所有的过滤器都必须实现Filter接口,这是建立过滤器链的首要前提。
1700484860
1700484861 我们再回过头来仔细看看类图,是不是有点熟悉?对,类似于中介者模式,我们并没有把中介者传递到各个同事类,只是我们采用中介者模式的思想,把中介者的职责分发出去由各个同事类来处理。
1700484862
1700484863
1700484864
1700484865
1700484866 设计模式之禅 38.1.2 模型管理器
1700484867
1700484868 模型管理器是整个MVC框架的难点,在这里我们会看到非常多的设计模式。我们在核心控制器的类图中看到有一个IActionDispatcher接口,它实现的模型行为分发是一个门面模式,如代码清单38-11所示。
1700484869
[ 上一页 ]  [ :1.70048482e+09 ]  [ 下一页 ]