【发布时间】:2015-03-08 05:59:52
【问题描述】:
我第一次看到 IO 类中的装饰器模式。现在,我正在观看有关复数视图、封装和 SOLID 的课程,该课程讨论了装饰器模式的另一种用法。这是类图。
MessageStore
|
<interface>
IStoreReader
|
---------------------------------------------------------
| | |
StoreLogger StoreCache FileStore
消息存储是一个可以通过接口 IStoreReader 从任何文件或数据库中读取的类。该类还有一种缓存底层 IStoreReader (FileStore) 返回的数据的方法。最后,在读取 StoreCache 之前和之后记录 MessageStore 的整个操作。他应用了装饰器模式,所以初始化的类是这样的:
IStoreReader fileStore = new FileStore( some arguments);
IStoreReader cache = new FileStore(fileStore);
IStoreReader storeLogger = new StoreLogger(cache);
MessageStore messageStore = new MessageStore(storeLogger);
IStoreReader 的唯一方法是 read(int id)。
代码是这样的:
StoreLogger :
public List<String> read(int id){
log.information("Reading ...");
return this.storeReader.read(id);
log.information("Done reading ...");
}
StoreCache :
public List<String> read(id){
List<String> result = this.cache.find(id);
if(result.isEmpty()){
return this.storeReader.read(id);
}
return result;
}
FileStore:
public List<String> read(id){
//implementation
}
由于 MessageStore 仅与一个 IStoreReader 交互,因此仅传递了 StoreLogger 的实例,这就是困扰我的事情。如果将 3 个类传递给 MessageStore(因为我相信这在某种程度上是一个服务类?)并且唯一的接口可以用 3 个更具体的接口代替,解决方案不是更好吗?可读性是此设计中的另一个问题。
另外,当我第一次看到如何使用装饰器模式时,我注意到它的目的是为传递的那个添加新值;正如在 IO 中观察到的,如 InputStream、BufferedInputStream 等。
请帮助我深入了解这一点。
【问题讨论】: