进阶:Java中用动态代理类实现记忆功能
作者: wwty , 出处:赛迪网, 责任编辑: 李春禹,
2007-12-27 13:17
最简单直接的方法来缓存返回值可以通过修改这个类来实现:添加一个map来保存之前计算得到的值,如下: import java.util.hashmap;通过使用decorator模式,要分开计算代码和缓存代码是很容易的.首先,定义一个接口,里面定义基本的方法.
| import java.util.hashmap; public class pibinarydigitscalculator { private hashmap cache = new hashmap(); public synchronized byte calculatebinarydigit( final int n) { final integer n = new integer(n); byte b = (byte) cache.get(n); if (b == null) { byte b = runbbpalgorithm(n); cache.put(n, new byte(b)); return b; } else { return b.bytevalue(); } } private byte runbbpalgorithm(final int n) { // lengthy routine goes here ... } } |
calculatebinarydigit 方法首先会检查hashmap里面是否缓存了这个关键字-参数n,如果找到了,就直接返回这个值.否则,就会进行这个冗长的计算,并将结果保存到缓存里面.在添加进hashmap的时候,在原始类型和对象之间还要进行小小的转换.
尽管这个方法是可行的,但是有几个缺点.首先,进行缓存的代码和正常的算法代码不是显著分开的.一个类,不仅负责进行计算,也要负责进行维护缓存数据.这样,要进行一些测试就会显得很困难.比如,不能写一个测试程序来测试这个算法持续地返回相同的值,因为,从第二次开始,结果都是直接从cache中获得了.
其次,当缓存代码不再需要,移除它会变得困难,因为它和算法块地代码是紧密结合在一起的.所以,要想知道缓存是否带来了很高的效率提升也是很困难的,因为不能写一个测试程序是和缓存数据分开的.当你改进了你的算法,缓存有可能失效-但是这个时候你并不知道.
第三,缓存代码不能被重用.尽管代码遵从了一个普通的模式,但是都是在一个类- pibinarydigitscalculator里面.
前面两个问题都可以通过构造一个缓存包装器来解决.
缓存包装器
通过使用decorator模式,要分开计算代码和缓存代码是很容易的.首先,定义一个接口,里面定义基本的方法.
| public interface binarydigitscalculator { public byte calculatebinarydigit(final int n); } 然后定义两个实现,分别负责两个任务: public class pibinarydigitscalculator implements binarydigitscalculator { public byte calculatebinarydigit(final int n) { return runbbpalgorithm(n); } private byte runbbpalgorithm(final int n) { // lengthy routine goes here ... } } import java.util.hashmap; public class cachingbinarydigitscalculator implements binarydigitscalculator { private binarydigitscalculator binarydigitscalculator; private hashmap cache = new hashmap(); public cachingbinarydigitscalculator( binarydigitscalculator calculator) { this.binarydigitscalculator = calculator; } public synchronized byte calculatebinarydigit(int n) { final integer n = new integer(n); byte b = (byte) cache.get(n); if (b == null) { byte b = binarydigitscalculator.calculatebinarydigit(n); cache.put(n, new byte(b)); return b; } else { return b.bytevalue(); } } } |
- 本文关键词:

