直截了当的告诉你什么是适配器模式

适配器模式绝对是软件开发当中最受关注的设计模式之一。

正如标题所说,我会直截了当的告诉你什么是适配器模式,不说太多的废话,因为设计模式这种东西需要慢慢的去体会。只有多思多闻,才能领会这些模式真的是设计的很巧妙。

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。好了,就是这么直截了当。

时间: 2024-10-03 21:53:21

直截了当的告诉你什么是适配器模式的相关文章

直截了当的告诉你什么是策略模式

策略模式的实现也是非常简单.还是那句话,直截了当,废话不多说. 模拟一个计算运费的程序 /// <summary> /// 配送方式 /// </summary> public enum ShippingOptions { EMS = 0, 顺丰 = 1, 圆通 = 2, 中通 = 4, 天天 = 8, 宅急送 = 16 } public class Order { public int Id { get; set; } public ShippingOptions Shippin

直截了当的告诉你什么是工厂模式

千万不要以为创建一个类,以Factory为后缀就是工厂,那不是工厂. 直接演示: public interface IMachine { string Name { get; } /// <summary> /// 机器启动 /// </summary> void TurnOn(); } public class Computer : IMachine { public string Name { get { return "戴尔"; } } public vo

程序员的 升级 ,价值观的改变

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha 第1章 为何这本书与你先前读过的任何书籍都迥然不同 高亮 [页面 19]: "优秀 的软件开发人员",是那些能够把控自己的职业生涯.达成目标.享受生活的人 高亮 [页面 19]: 一名软件开发人员如何超越编写代码本身? 高亮 [页面 19]: 如果你想真正成为一个更好的软件开发人员(或者其他真正优秀的人 才),你需要把重点放在整个"人"上,而不只是你生活

摩拜获巨额融资,为何还被曝拖欠底层员工薪水?

当前的中国互联网圈子一直不缺劲爆话题,共享单车尤是风口浪尖.如果关注或是搜索共享单车相关关键词,满屏的利好消息顿时便会充斥整个屏幕,让人一眼看去其乐融融和谐无边的景象几乎直截了当的告诉读者:共享单车是太阳底下最灿烂的事业,比如动辄融资数亿美金.或是市场份额已经轻易碾压对手-- 然而抛开公关宣传和资本手段之后,大众才会发现所有关于浮面的荣光和鲜花底下,几乎都有不可遮掩的暗面,其中一些近乎让人不齿的举动更是让人眼界全开. 摩拜融资6亿,但被曝已拖欠员工4月工资 摩拜单车是共享单车领域的当家花旦,依靠

在普林斯顿大学做助理教授的日子--施一公教授

- 与国内年轻PI共勉 [序:对每一位刚刚在清华大学生命科学学院或医学院建立独立实验室的年轻PI(Principal Investigator),我都会不止一次地忠告:至少要在前三年,你们一定要把自己当成超级博士后,身先士卒.尽全力地在实验室做研究.做自己的课题,同时训练培养博士生.实验员和博士后.只要能够重复你们博士生和博士后阶段的辉煌,你们就不愁在清华拿不到tenure!] 普林斯顿的offer 1997年3月27日下午,在纽约市Memorial Sloan-Kettering Cancer

Unreal发展史

Unreal发展史 引子 四年前的一个深夜,或者说是一个早晨,Unreal的传奇开始了.它发生在马里兰州一个不起眼的市镇Rockvill,在一套公寓大楼里回响起一支墨西哥流浪乐队的曲子,那里住着Epic MegaGames的游戏开发成员. 清晨5点,三位游戏设计师还在听着最后一首曲子,那墨西哥人特有的华美旋律直透墙壁传至外间.毕竟,在游戏世界里,清晨5点,并不是指公鸡打鸣天要亮了,而是意味着程序师们苦熬了一个夜晚后终于可以关灯睡觉了. 作一名游戏开发者从来就不是潮流,而在当时那个年代,它更是没有

再一次的音标学习

新一轮的音标学习已经过了一半,之前都是被别人带着,这次也独挑了一把大梁,感觉收获还是蛮大的. 说说我的收获: 首先,我再一次确定了音标学习,是可以在一个短期的时间有一个比较大的进步的,因为很多人英语说不好很大原因是不知道该从哪里发音,或者是用中式发音的方式去说英语,要知道,中文的发音部位和英文是不一样的,所以,如果从来都不去刻意改正自己的发音部位,即使在认真的读英语,也很难读的很好,而想要知道这个很简单,学习就好了,让别人一起帮忙纠正,就可以得到一个很大的提高. 其次,英标学习是一个需要反复的过

特朗普变脸:同媒体“友好会谈”,怨媒体“死不悔改”

今日导读 美国总统特朗普自参选开始,与各大美国主流媒体的关系就一直非常紧张.前不久,他与纽约时报的发行人进行了一次会面,特朗普将这次会面形容得相当积极.然而没想到的是,双方一转眼又回到了剑拔弩张的状态,开始以个人声明和推特的形式隔空"互掐".双方的争辩重点在于何处呢?一起来看一看这篇英国卫报的报道. 带着问题听讲解 Q1: 文中可以找到哪些表达"谴责,抨击"的词或词组? Q2: 如何理解文中的"exchange"? Q3: 纽约时报发行人认为特朗

适配器模式--Adapter Pattern

模拟场景:很多人都喜欢看NBA吧,姚明进驻NBA,打开了中国的市场.虽然后面姚明在NBA打得还不错,但是在刚进入NBA篮坛的时候,并不是那么顺利的.语言交流就是一个最大的问题.刚开始打球期间,教练及队员的战术部署姚明都无法理解,所以他需要这么一个翻译者,将教练及队员的意思转达给姚明,这样才可以进行合作. 现在进行场景的模拟,先不考虑那么多.假如姚明一开始进入NBA的时候就已经会英语,可以进行交流了.那么这个时候教练就可以进行战术的部署了. 转换成类,所有的队员都要服从教练的战术要求,假设现在教练