Wouldn't it be simpler to have a cache by composition rather than making the entire service a cache? (same goes with the Observer).