MST

星途 面试题库

面试题:Java中装饰器模式在缓存系统里如何实现基础功能增强

假设已有一个简单的缓存系统,使用Java实现,它具备基本的缓存读取和写入功能。请基于装饰器模式,为该缓存系统添加一个功能:在每次读取缓存数据后,记录读取操作的时间戳。描述实现思路并给出关键代码示例。
36.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义缓存接口:已有缓存系统具备基本读取和写入功能,定义一个接口 Cache 包含 getput 方法。
  2. 实现具体缓存类:实现 Cache 接口的具体缓存类 SimpleCache,包含实际的缓存逻辑。
  3. 定义装饰器抽象类:定义一个抽象装饰器类 CacheDecorator 实现 Cache 接口,并持有一个 Cache 实例的引用,通过构造函数初始化。该抽象类对接口方法进行默认实现,具体装饰器类继承它并按需重写方法。
  4. 实现时间戳记录装饰器:创建一个具体的装饰器类 TimestampLoggingCacheDecorator 继承自 CacheDecorator。重写 get 方法,在调用原 get 方法获取数据后,记录当前时间戳。

关键代码示例

// 缓存接口
interface Cache {
    Object get(String key);
    void put(String key, Object value);
}

// 具体缓存类
class SimpleCache implements Cache {
    private Map<String, Object> cache = new HashMap<>();

    @Override
    public Object get(String key) {
        return cache.get(key);
    }

    @Override
    public void put(String key, Object value) {
        cache.put(key, value);
    }
}

// 缓存装饰器抽象类
abstract class CacheDecorator implements Cache {
    protected Cache cache;

    public CacheDecorator(Cache cache) {
        this.cache = cache;
    }

    @Override
    public Object get(String key) {
        return cache.get(key);
    }

    @Override
    public void put(String key, Object value) {
        cache.put(key, value);
    }
}

// 时间戳记录装饰器
class TimestampLoggingCacheDecorator extends CacheDecorator {
    public TimestampLoggingCacheDecorator(Cache cache) {
        super(cache);
    }

    @Override
    public Object get(String key) {
        Object result = cache.get(key);
        System.out.println("Read at: " + new Date());
        return result;
    }
}

使用示例

public class Main {
    public static void main(String[] args) {
        Cache simpleCache = new SimpleCache();
        Cache timestampCache = new TimestampLoggingCacheDecorator(simpleCache);

        timestampCache.put("key1", "value1");
        Object value = timestampCache.get("key1");
    }
}