本示例演示如何DbProductRepository使用Decorator模式添加缓存功能。该方法遵循SOLID原则,因为它允许您添加缓存而不会违反单一职责原则或开放/封闭原则。
public interface IProductRepository { Product GetProduct(int id); } public class DbProductRepository : IProductRepository { public Product GetProduct(int id) { //返回从数据库检索的产品 } } public class ProductRepositoryCachingDecorator : IProductRepository { private readonly IProductRepository _decoratedRepository; private readonly ICache _cache; private const int ExpirationInHours = 1; public ProductRepositoryCachingDecorator(IProductRepository decoratedRepository, ICache cache) { _decoratedRepository = decoratedRepository; _cache = cache; } public Product GetProduct(int id) { var cacheKey = GetKey(id); var product = _cache.Get<Product>(cacheKey); if (product == null) { product = _decoratedRepository.GetProduct(id); _cache.Set(cacheKey, product, DateTimeOffset.Now.AddHours(ExpirationInHours)); } return product; } private string GetKey(int id) => "Product:" + id.ToString(); } public interface ICache { T Get<T>(string key); void Set(string key, object value, DateTimeOffset expirationTime) }
用法:
var productRepository = new ProductRepositoryCachingDecorator(new DbProductRepository(), new Cache()); var product = productRepository.GetProduct(1);
调用的结果GetProduct将是:从缓存中检索产品(装饰者职责),如果产品不在缓存中,则继续调用DbProductRepository数据库并从数据库中检索产品。之后可以将该产品添加到缓存中,以便后续调用不会到达数据库。
Django为视图提供了数个装饰器,用以支持相关的HTTP服务。 允许的HTTP 方法 django.views.decorators.http 包里的装饰器可以基于请求的方法来限制对视图的访问。若条件不满足会返回 django.http.HttpResponseNotAllowed。 require_http_methods(request_method_list)[source] 限制视图只能
装饰器(Decorators)(被babel支持, 在 03/17 之后作为stage-2的proposal被引入) 如果你在使用类似于mobx的库, 你能够使用装饰器装饰你的函数. 装饰器本质上其实就是将组件传入一个函数. 使用装饰器能让组件更灵活,更可读并且更易修改组件的功能. 不使用装饰器的例子 class ProfileContainer extends Component { //
上一篇文章将通过解决一个需求问题来了解了闭包,本文也将一样,通过慢慢演变一个需求,一步一步来了解 Python 装饰器。 首先有这么一个输出员工打卡信息的函数: def punch(): print('昵称:两点水 部门:做鸭事业部 上班打卡成功') punch() 输出的结果如下: 昵称:两点水 部门:做鸭事业部 上班打卡成功 然后,产品反馈,不行啊,怎么上班打卡没有具体的日
fabfile 中可以方便使用的装饰器。 fabric.decorators.hosts(*host_list) 该装饰器用于指定被装饰的函数执行在那台主机或哪些主机列表上。 例如:如果不在控制台覆盖相关参数的话,将会在 host1、host2 以及 host3 上执行 my_func,并且在 host1 和 host3 上都指定了登录用户。 @hosts('user1@host1', 'host
由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。 >>> def now(): ... print '2013-12-25' ... >>> f = now >>> f() 2013-12-25 函数对象有一个__name__属性,可以拿到函数的名字: >>> now.__name__ 'now' >>> f.__name__ 'now' 现在,假设我
由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。 >>> def now(): ... print('2015-3-25') ... >>> f = now >>> f() 2015-3-25 函数对象有一个__name__属性,可以拿到函数的名字: >>> now.__name__ 'now' >>> f.__name__ 'now' 现在,假设我们