石岩附近做网站公司,做展示型网站便宜吗,私域电商平台,阳光家园广州网站网址装饰者模式介绍装饰器模式#xff08;Decorator Pattern#xff09;是在不改变原类和使用继承的情况下#xff0c;动态地给一个对象添加一些额外的职责。它是通过创建一个包装对象#xff0c;也就是装饰来包裹真实的对象。可以在如下使用场景中使用装饰器模式#xff1a;在… 装饰者模式介绍装饰器模式Decorator Pattern是在不改变原类和使用继承的情况下动态地给一个对象添加一些额外的职责。它是通过创建一个包装对象也就是装饰来包裹真实的对象。可以在如下使用场景中使用装饰器模式在不影响其他对象的情况下以动态、透明的方式给单个对象添加职责。需要动态地给一个对象增加功能这些功能也可以动态地被撤销。当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。Demo假设我们使用IRepository接口的实现类Repository进行数据库访问:public interface IUserRepository
{User Get(int Id);
}public class UserRepository : IUserRepository
{public User Get(int Id){Console.WriteLine(访问数据库);//模拟数据库访问return new User(Id, My IO);}
}现在有一个新的需求要求增加缓存功能即先从缓存获取数据缓存不存在再访问数据库。有几种方法可以做到这一点修改业务逻辑在访问Get前读取缓存使用面向切面AOP模式在调用Get方法时注入读取缓存逻辑修改UserRepository实现缓存功能;继承UserRepository类在派生类中实现缓存功能使用装饰器模式封装UserRepository类在新的UserRepositoryDecorator类中嵌入实现缓存功能在这里我们使用装饰器模式internal class UserRepositoryCacheDecorator : IUserRepository
{private readonly IUserRepository _userRepository;public UserRepositoryCacheDecorator(IUserRepository userRepository){_userRepository userRepository;}public User Get(int Id){Console.WriteLine(访问缓存);return _userRepository.Get(Id);}
}首先我们还是实现与UserRepository类相同的IUserRepository接口;其次我们将IUserRepository接口注入到构造函数中;最后在Get方法中我们再次调用注入的接口的Get方法它应该调用UserRepository类的实现。显然如果还是按普通方式进行依赖注入将不可能成功builder.Services.AddTransientIUserRepository, UserRepository();builder.Services.AddTransientIUserRepository, UserRepositoryCacheDecorator();这时我们可以引用 Nuget 包Scrutor然后使用它提供的Decorate方法builder.Services.AddTransientIUserRepository, UserRepository();builder.Services.DecorateIUserRepository, UserRepositoryCacheDecorator();现在再运行你将看到装饰器模式已经实现了结论可以添加多个装饰为原来的功能增加不同的职责而仅需的操作就是调用Decorate方法进行注册builder.Services.DecorateIUserRepository, UserRepositoryCacheDecorator();builder.Services.DecorateIUserRepository, UserRepositoryLogDecorator();添加微信号【MyIO666】邀你加入技术交流群