开关的诞生

话说在一个紧耦合的世界,有一个名为tmfc的工匠,一天,他发明了一个叫做开关的的设备。他琢磨了老半天,决定把开关装在自己的床头,这样他就不用在睡前起床去拔电灯的电线了(这可是个紧耦合的世界啊),tmfc对自己的发明非常满意。

class Switch{
    Light light;
    public void Switch(Light l){
        light = l;
    }
    public void TurnOn(){
        light.On();
    }
    public void TurnOff(){
        light.Off();
    }
}

    tmfc发明了开关的事情很快在他的朋友圈中传了开来,大家都对这个好东西非常感兴趣,一个朋友的朋友的朋友,电风扇厂的老板,听说了这个消息之后兴奋的马上开着他的BMW(传说中的“别摸我”)来到tmfc的住处表示愿意用此车来交换一个能装在他们的风扇上的开关。
    tmfc虽然对这位朋友没什么好感,但是名车的诱惑还是难挡,于是他爽快的答应了下来,过了两天(这两天中,tmfc花了一天半开车到处去兜风^_^),老板就拿到了非常好用的风扇开关。

class FanSwitch{
    Fan fan;
    public void FanSwitch(Fan f){
        fan = f;
    }
    public void TurnOn(){
        fan.On();
    }
    public void TurnOff(){
        fan.Off();
    }
}

基板和接口

电风扇厂的技师们没费多大力气就把开关装在了风扇上,风扇推出后及其的受欢迎,老板朋友很快买了新款的Benz,而tmfc也由于发明开关而变得名声大噪,来自全国各地的合作请求络绎不绝,tmfc很快便厌倦了重复的生产(已经不能称这种行为为设计了)不同开关的生活,作为一个聪明人(同时也是一个懒人),他很自然的想到了“为什么我不设计一种通用的开关呢?”。没过多久(当然,他是聪明人嘛!)tmfc有了这样的设计:

abtract class AbstractSwitch{
    abstract public void TurnOn();
    abstract public void TurnOff();
}

他对所有的客户展示了他那优雅而简洁的设计,他声称只要客户的产品从简单的使用AbstractSwitch基板作为他们产品的基板,就可以非常容易的拥有开关的功能,而不必在这里等待他一个个的完成不同的开关产品。“我们的产品已经有基板了,而我们使用的流水线不支持多基板!!”,“我们的产品非常小,无法使用这么大的基板!!”,“使用基板我们的成本提高了一倍!!”,对于这个方案,客户们显然十分不满。面对这个结果,tmfc显得有些意外,但是作为一个优秀工匠(也许我们应该现在应该称他为工程师了),他很快就拿出了更好的解决方案。

Interface ISwitchable{
    On();
    Off();
}

class InterfaceSwitch{
    ISwitchable target;
    public void InterfaceSwitch(ISwitchable t){
        target = t;
    }
    public void TurnOn(){
        t.On();
    }
    public void TurnOff(){
        t.Off();
    }
}

这次,不需要使用基板,只要增加一个额外的和开关之间的接口就可以在设备上使用开关了,“这下大家满意了吧!”tmfc边咕哝着边给客户们演示了他的新设计。不出所料,大部分的客户感到很满意,虽然需要额外的接口,但还在接口还算便宜,体积也非常的小巧。大部分的客户都愉快的拿着开关和接口走了(剩下那些不是很满意的为了不惹恼它们这个世界上唯一能给他们开关的人,也不得不拿着接口和开关回去想办法说服老板接受这个方案),tmfc也重新开始了开着BMW兜风的日子。

解耦的故事(一)-tmfc的开关(转)相关推荐

  1. [活动]《博客园精华集》设计模式分册第2轮筛选结果公示

    说明 <博客园精华集>设计模式分册第2论筛选结果,总共有284篇,主要由TerryLee.idior.怪怪三人完成.在经过第三轮打分之后,还会有很多的文章出局.请大家发现以下文章中有转载或 ...

  2. 《设计模式》(精华集)

    Web Client Software Factory系列(3):View-Presenter模式作者: TerryLee .NET设计模式(18):迭代器模式(Iterator Pattern)作者 ...

  3. 设计模式(博客园精化集)〈转〉

    转自:http://blog.csdn.net/tuwen/archive/2011/03/04/6224179.aspx Web Client Software Factory系列(3):View- ...

  4. 《设计模式》(博客园精华集)

    转自:http://archive.cnblogs.com/a/1720782/  在此非常感谢谢博主 圣殿骑士 Web Client Software Factory系列(3):View-Prese ...

  5. [转载]《博客园精华集》设计模式 (164-284)

    设计模式三重天[之一] 作者: 代震军设计模式三重天[之二] 作者: 代震军设计模式三重天[之三] 作者: 代震军.NET2.0 框架中的 AbstractFactory 模式 作者: 代震军.NET ...

  6. 万字长文 - 解读功能开关 | IDCF

    原文:https://martinfowler.com/articles/feature-toggles.html 作者:Pete Hodgson 译者:冬哥 功能开关Feature Toggle(通 ...

  7. 依赖注入?依赖注入是如何实现解耦的?

    如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的? 第一章:小明和他的手机 从前有个人叫小明 小明有三大爱好,抽烟,喝酒-- 咳咳,不好意思,走错片场了.应该是逛知乎.玩王者农药和抢微信红包 ...

  8. 数据分析从头学_数据新闻学入门指南:让我们从头开始构建故事

    数据分析从头学 by Mina Demian 由Mina Demian 数据新闻学入门指南:让我们从头开始构建故事 (A Beginner's Guide to Data Journalism: Le ...

  9. 宇宙膨胀背后的故事(卅三):宇宙之有生于无

    本文来自程鹗科学网博客 1969年,卡特和霍金的导师.剑桥大学宇宙学家夏玛(Dennis Sciama)在哥伦比亚大学讲学.在他话语停顿的间隙,有人突然迸出一句:"也许宇宙就是一个真空涨落( ...

最新文章

  1. 眉目传情之匠心独运的kfifo【转】
  2. 七天学会ASP.NET MVC (五)——Layout页面使用和用户角色管理
  3. CSS样式让一个块在最上层中显示
  4. 【加权并查集】bzoj 4602 齿轮
  5. 部署在Netweaver上的Fiori应用的WebContent文件夹
  6. 排查 Linux 系统故障,看这一篇足够了。
  7. iOS多线程编程之锁的理解
  8. 会议之后,对应内容的再次确认
  9. 操作系统原理(二)操作系统逻辑结构、CPU的态和中断机制
  10. 字典 python 引用_Python字典引用的应用
  11. Android-两种方式实现走马灯效果
  12. python 单因子方差分析_假设检验之F检验-方差分析
  13. Spring Boot 项目启动的七种方式
  14. html画布刮刮乐,h5canvas实现刮刮乐效果的方法
  15. Eclipse插件(RCP)自定义编辑器添加Dirty效果
  16. 【模型开发】评分卡应用
  17. 终于有人把 单点 登录说清楚了!
  18. 基站、WiFi、IP定位原理介绍与区别
  19. 【100个 Unity实用技能】| 关于触发器互相检测的必要前提条件配置
  20. Android横向滚动卡片,Android仿探探卡片式滑动效果实现

热门文章

  1. Parallel小记
  2. iOS开发中使用[[UIApplication sharedApplication] openURL:]加载其它应用
  3. ZooKeeper场景实践:(6)集群监控和Master选举
  4. IE6下绝对定位的DIV被相对定位的DIV挡住的问题
  5. 【Unique Binary Search Trees II】cpp
  6. 编程的本质探索Nature of Coding
  7. 增加CentOS File Descriptors
  8. 防止一个进程被多次启动
  9. STM32 资料整理贴(更新到10年1月)[转]
  10. Ubuntu下开启SSH服务