首页 > 代码库 > 直截了当的告诉你什么是适配器模式
直截了当的告诉你什么是适配器模式
适配器模式绝对是软件开发当中最受关注的设计模式之一。
正如标题所说,我会直截了当的告诉你什么是适配器模式,不说太多的废话,因为设计模式这种东西需要慢慢的去体会。只有多思多闻,才能领会这些模式真的是设计的很巧妙。
public class Customer
{
}
public interface ICustomerRepository
{
IList<Customer> GetCustomers();
}
public class CustomerService
{
private readonly ICustomerRepository _customerRepository;
public CustomerService(ICustomerRepository customerRepository)
{
_customerRepository = customerRepository;
}
public IList<Customer> GetAllCustomers()
{
IList<Customer> customers;
string storageKey = "GetAllCustomers";
customers = (List<Customer>)HttpContext.Current.Cache.Get(storageKey);
if (customers == null)
{
customers = _customerRepository.GetCustomers();
HttpContext.Current.Cache.Insert(storageKey, customers);
}
return customers;
}
}
上面的代码有什么问题?
- 可测性 CustomerService这个类是在一个类库项目中,在一个类库项目中一旦出现HttpContext可测性将会变得非常差
- 灵活性 我们用HttpContext作为缓存方案,以后想换成别的,例如:Memcache或Redis,这个时候就得手动修改HttpContext方案替换为别的方案
解决办法:
public interface ICacheStorage
{
void Remove(string key);
void Store(string key, object data);
T Retrieve<T>(string key);
}
public class CustomerService
{
private readonly ICustomerRepository _customerRepository;
private readonly ICacheStorage _cacheStorage;
public CustomerService(ICustomerRepository customerRepository, ICacheStorage cacheStorage)
{
_customerRepository = customerRepository;
_cacheStorage = cacheStorage;
}
public IList<Customer> GetAllCustomers()
{
IList<Customer> customers;
string storageKey = "GetAllCustomers";
customers = _cacheStorage.Retrieve<List<Customer>>(storageKey);
if (customers == null)
{
customers = _customerRepository.GetCustomers();
_cacheStorage.Store(storageKey, customers);
}
return customers;
}
}
public class HttpContextCacheStorage : ICacheStorage
{
public void Remove(string key)
{
HttpContext.Current.Cache.Remove(key);
}
public void Store(string key, object data)
{
HttpContext.Current.Cache.Insert(key, data);
}
public T Retrieve<T>(string key)
{
T itemsStored = (T)HttpContext.Current.Cache.Get(key);
if (itemsStored == null)
{
itemsStored = default(T);
}
return itemsStored;
}
}
我们已经封装了一个HttpContext缓存对象的适配器类,下一步是使用ICacheStorage接口注入它,不在本文讨论范围之内。将来如果使用不同的缓存方案,那么需要做的就是编写其他的适配器 如 Memcache,Redis。好了,就是这么直截了当。
直截了当的告诉你什么是适配器模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。