
硬啃设计模式
文章平均质量分 65
设计模式很神奇,越看越晕,越晕越想看懂她!一些书籍或资料通过生活中的例子或者是虚构的代码来展示设计模式,可能有点“牵强附会”,希望能为大家分享一些实在的例子,“硬啃”和“品味”设计模式!
张传波
软件研发及管理分享大师,《火球-UML大战需求分析》作者,创新工场敏捷课程讲师,豆芽儿-软件研发人才成长社区(www.douya2.com)创始人,豆芽儿公众号原创作者
展开
-
4.12 《硬啃设计模式》 第29章 行为型设计模式小结
序号 模式 一句话说明 1 观察者(Observer) 一呼百应。 2 策略(Strategy) 分离算法。 3 迭代器(Iterator) 以一致的方式访问集合,“松绑”遍历算法代码。 4 命令(Command) 分离功能调用者与功能实现者。 5 访问者(Visitor) 不改变对象结构增加新方法。 6 解释器(Interpreter原创 2013-11-27 11:59:30 · 2082 阅读 · 0 评论 -
4.11 《硬啃设计模式》 第28章 邮件自动处理系统?- 责任链模式(Chain of Responsibility Pattern)
公司的对外邮箱,每天都收到大量的邮件,于是一个伟大的任务就落到你头上了。你需要清理掉垃圾邮件,应聘的邮件发给招聘部门,客户邮件发给服务部门…… 这些邮件分发规则很可能会增加。你打算写一个大 switch 包含多个 case 来应对,还是打算应用责任链模式呢?原创 2013-11-27 11:52:47 · 2335 阅读 · 0 评论 -
4.10 《硬啃设计模式》 第27章 是攻击还是逃走?- 状态模式(State Pattern)
游戏有以下规则:1.玩家距离敌人比较远时,敌人会看不见玩家,按既定路线巡逻。2.玩家距离敌人比较近时,敌人会发现玩家并进行攻击。3.当敌人被杀得差不多,只剩下一两个时,敌人会逃走。4.敌人可能会隐藏起来伏击玩家。5.……(省略号的意思是表示规则还会修改和增加) 你会怎样设计呢?本文为你分享状态模式,状态模式其实与游戏中经常用到的有限状态机AI算法,其实是一个原理。原创 2013-11-26 14:08:27 · 2340 阅读 · 1 评论 -
4.9 《硬啃设计模式》 第26章 万能排序 - 模板方法模式(Template Method Pattern)
排序算法很多人都会,但如果将排序的问题扩大,例如:我们要对字符、日期、任意类型的对象进行排序,那是不是每种情况都要重新写一次代码呢?其实排序的框架算法是不变的,没有必要针对不同情况重新写一次,这时候“模板方法”可以帮助我们。原创 2013-11-24 22:17:55 · 2176 阅读 · 0 评论 -
4.8 《硬啃设计模式》 第25章 假如一切可以重来 - 备忘录模式(Memento Pattern)
当需要保存对象多个状态,并且可以恢复到任意状态,可考虑备忘录模式。将对象、对象状态和状态的保存办法分离,设计上会更加灵活。原创 2013-11-22 12:11:15 · 2423 阅读 · 0 评论 -
4.7 《硬啃设计模式》 第24章 麻烦的多角关系 - 中介者模式(Mediator Pattern)简介
在Windows程序中,有时候界面控件之间的交互会很麻烦,如:A控件显示什么的时候,B控件要显示什么,另外C控件要不可用,同样其它控件也会有类似的复杂要求。控件与控件之间很容易形成复杂的多角关系了。现在让你来梳理这些多角关系,你会咋办?蜘蛛网般的多角关系是很麻烦,所有麻烦最好通过一个中间人来解决,这就是中介者模式的核心思想。原创 2013-11-17 21:45:05 · 2241 阅读 · 0 评论 -
4.6 《硬啃设计模式》 第23章 超级表达式解释引擎 - 解释器模式(Interpreter Pattern)
我们要做一个表达式解释引擎,能解释带有变量的任意表达式。例如:表达式为“123+a * (b-456)/c-789”,其中a、b、c为变量,只需要给定a、b、c的值,就可以计算出结果。该表达式引擎支持四则运算、括号和任意数量的变量,并且我们希望能逐步扩展该引擎,使之可以用上各种函数,如:三角函数、Sqrt等。你怎样考虑这个设计?原创 2013-11-15 18:55:18 · 2599 阅读 · 0 评论 -
4.5 《硬啃设计模式》 第22章 增加新方法的烦恼 - 访问者模式(Visitor Pattern)
这个类是原来老系统的,我们想扩展它的功能,但又不太希望改变它的“接口”,或者说尽量少改变它的“接口”。你看有什么办法,能在外面增加这个类的功能?这样的要求也太强人所难了吧?不能动它,又要增加方法?完全不改原来的类是不可能增加新方法的,我们要想办法开一个“小口”,通过这个“小口”来实现灵活增加它的功能。访问者模式就是通过这个“小口”来访问原类,从而增强原类的功能。原创 2013-11-14 12:31:23 · 2462 阅读 · 0 评论 -
4.4 《硬啃设计模式》 第21章 神奇的Undo与Redo - 命令模式(Command Pattern)
Undo和Redo是很酷、很神奇、很有用的功能!如果要求你在你的软件中实现Undo和Redo,你会怎样考虑呢?原创 2013-11-11 14:27:47 · 2853 阅读 · 0 评论 -
4.3 《硬啃设计模式》 第20章 集合访问的烦恼 - 迭代器模式(Iterator Pattern)
程序中可能会用很多方式管理集合,如数组、collection、list、hashtable等,这些集合之间进行数据交换就麻烦了,因为大家保存方式不一样。如果规定大家都要使用hashtable,这样本来没有使用hashtable的程序将要大改!你有什么好办法来解决这个问题?设计分析:集合保存的方式确实有很多,如果我们能做到不管内部怎样的保存方式,只要对外能提供一致的集合访问接口,问题就可以解决了。那应该如何定义这个对外的集合访问接口呢?原创 2013-11-10 18:42:07 · 2475 阅读 · 0 评论 -
4.2 《硬啃设计模式》 第19章 设计你的战士 - 策略模式(Strategy Pattern)
策略模式不将算法“绑死”在Class中,而将算法独立出来,可根据需要替换算法,此模式让算法的变化独立于使用算法的Class。本文将会通过游戏中的NPC设计实例来体会策略模式。原创 2013-11-09 16:32:43 · 2518 阅读 · 0 评论 -
4.1 《硬啃设计模式》 第18章 同步更新的问题 - 观察者模式(Observer Pattern)
某程序以多种不同的形式展示相同的数据,展示的方式可能是表格、柱状图、饼图等。当数据发生变化时,所有的展示方式都需要同步更新。你会怎样设计,来灵活应对展示方式的不确定性呢?原创 2013-11-08 11:00:46 · 2439 阅读 · 0 评论 -
3.8 《硬啃设计模式》 第17章 结构型设计模式小结
序号 模式 一句话说明 1 桥(Bridge) 将“抽象”和“实现”自由搭配。 2 轻量(Flyweight) 轻松地处理“大量”对象。 3 外观(Façade) 同时提供简单接口和复杂接口。 4 装饰者(Decorator) 不改变接口但要增强功能。 5 组合(Composite) 不管你是老子还是儿子,都一样处理。 6 代理(Pro原创 2013-11-07 12:33:37 · 2041 阅读 · 0 评论 -
3.7 《硬啃设计模式》 第16章 老掉牙系统的重生 - 适配器模式(Adapter Pattern)
有一个老到掉牙的系统,需要与一个新系统对接,新老系统的接口要求是不一样的。你不想直接改动这个老系统,你有什么解决妙方?改动老系统的风险是比较大的,最好在不改变老系统的情况下增加一些东西,使老系统满足新系统的接口要求,这就是适配器模式的基本思路。原创 2013-11-07 12:28:10 · 2658 阅读 · 1 评论 -
3.6 《硬啃设计模式》 第15章 超级文档编辑器 - 代理模式(Proxy Pattern)
你要做一个能和Word比美的文档编辑器,其中一个重大功能是:文档中能插入很多图片。但如果文档的图片太多,文档加载的速度将会变得很慢,于是你想到的方法是不必所有图片都直接显示出来,可以先显示一个带叉叉的虚拟图片,当用户停留在当前图片时,才加载真正的图片。不过除了图片,如视频、flash等其它可能需要耗大量资源的东西可能也需要这样处理。你打算如何设计呢?原创 2013-11-07 12:21:35 · 3013 阅读 · 2 评论 -
3.5 《硬啃设计模式》 第14章 超酷绘图软件 - 组合模式(Composite Pattern)
某绘图软件,能绘制点、线、面等简单几何形体,同时也能将这些简单形体组合成更复杂的图形。该设计看上去不错,容器可以不管被“包容”的具体是什么东西。但组后以后可不可以再组合呢?Office软件可以做到将任意图形组合,并且组合后可以再组合,以上这个设计恐怕做不到吧?我们如何用组合模式来改善一下这个设计呢?原创 2013-11-06 13:43:38 · 4752 阅读 · 1 评论 -
3.4 《硬啃设计模式》 第13章 星巴克的饮料计价系统 - 装饰者模式(Decorator Pattern)
星巴克有一个非常酷的饮料价格计算系统,这个软件的设计可谓相当地酷!Coffee(咖啡)、Mocha(摩卡)、Latte(拿铁)这三种饮品都实现了IDrink接口,要计算它们的价钱真是相当的容易,而且不管以后增加怎样的饮品,只要实现了IDrink接口,很容易计算价钱。不过星巴克的饮料出名,有一个很重要的做法就是每种饮料都可以加配料,如:牛奶、豆浆、雪糕等,而且配料可以加多种和多份,加了配料的饮料价格是:饮料+所有配料的价钱。Well,怎样修改这个设计?配料要怎样考虑进去呢?(本案例纯属虚构)原创 2013-11-06 13:36:45 · 8983 阅读 · 1 评论 -
3.3 《硬啃设计模式》第12章 超级手机 - 外观模式(Facade Pattern)
你需要设计一台超级手机的操作系统,用户可以对各个方面进行详细的定制,如:铃声、桌面、图标、颜色、播放器喜好、浏览器设置等等。太详细的设置对于一般用户来说太复杂了,但高级用户又很喜欢这些超详细的设置。你有什么好的设计方案?原创 2013-11-06 13:03:51 · 2445 阅读 · 0 评论 -
2.7 《硬啃设计模式》 第9章 创建型设计模式小结
序号 模式 一句话说明 1 简单工厂 避免重复的new代码。 2 单件(Singleton) 全局只有一个。 3 工厂方法(Factory Method) 生产系列产品。 4 抽象工厂(Abstract Factory)原创 2013-11-06 12:57:03 · 1943 阅读 · 0 评论 -
3.2 《硬啃设计模式》第11章 森林里的树太多了!- 轻量模式(FlyWeight Pattern)
有一个森林模拟软件,能随机生成几十种不同数量的树木,并在屏幕中绘制出来。可是问题来了,当数目数量很大的时候,这些树消耗掉大量的内存,程序就越跑越慢了!我们希望每一个树还是一个对象,但又不希望内存消耗过大,你有什么解决办法呢?原创 2013-11-05 16:05:57 · 2681 阅读 · 0 评论 -
3.1 《硬啃设计模式》第10章 麻烦的日志记录 - 桥模式(Bridge Pattern)
某日志组件既支持输出到文本文件,也支持输出到数据库文件,但同时又要求支持不同的加密方式。加密和输出方式两者应该不太相干,用怎样的加密方法不应该影响到用什么输出方式,同样用怎样的输出方式也不应该影响到用什么办法加密。我们现在要解决的问题是如何让加密、输出方式这两组功能能组合在一起,又不会互相耦合。如果发现需要将两组功能组合来用时,可以考虑用“桥”将这两组功能组合起来。原创 2013-11-01 15:05:49 · 2274 阅读 · 0 评论 -
2.6 《硬啃设计模式》第8章 复制不是很难 - 原型模式(Prototype Pattern)
某即时战略游戏,你训练出来各种很强的战士。为了增加游戏的可玩性,增加了一种复制魔法。实施该魔法,可以复制任意的战士。你会怎样考虑这个设计?原创 2013-10-30 22:55:50 · 1829 阅读 · 0 评论 -
2.5 《硬啃设计模式》第7章 车手选车 - 生成器(Builder Pattern)
某赛车游戏,玩家可以选择不同的车,这些车其实是采用不同性能的配件组成的,如:车胎、发动机等。玩家选择一部车,其实就是new了一部车。你如何考虑“new car”的代码?要new这个车,可能需要先new出车的各个配件,然后将这些配件组合成car。某些复杂对象要new出来时,往往需要先new出它的子对象,然后组装成进父对象中,这些子对象有时候甚至组成了“树”结构。生成器模式就是用来解决这问题的。原创 2013-10-29 20:19:44 · 1955 阅读 · 0 评论 -
2.4 《硬啃设计模式》第6章 “妞”太多,如何管理?(3)- 抽象工厂(Abstract Factory Pattern)
有时候我们希望能得到一系列对象,不是一个对象,这时我们可考虑用抽象工厂,抽象工厂中有多个方法,分别得到不同的对象。原创 2013-10-28 19:54:26 · 1868 阅读 · 0 评论 -
UML常用工具及如何快速上手
我使用过不少UML软件,我会简单介绍我的一些心得体会,希望这些体会能帮助你更快上手、更快找到适合你自己或贵公司的软件。但我不会具体介绍某一种或几种UML工具的细节,也不会说我用得最多的是哪个软件,免得有广告的嫌疑。原创 2013-10-25 22:25:59 · 2934 阅读 · 0 评论 -
2.3 《硬啃设计模式》 第5章 “妞”太多,如何管理?(2)- 工厂方法(Factory Method Pattern)
我在实际工作中还没有用过工厂方法,本文简单谈谈我的理解,供大家参考。这个图一下子不太好理解,我们先回顾一下简单工厂,简单工厂是通过一个方法来包装new对象的动作,如果我们将new对象的动作包装到一个类中,那么这个类就可以看成是一个工厂,该工厂专门用来产生某些对象的。有时候我们希望能生产苹果、西瓜、葡萄等不同品种的水果,这样一个工厂就不能满足要求,我们需要分别做出苹果工厂、西瓜工厂、葡萄工厂,需要苹果时就调用苹果工厂的CreateProduct()就搞定了。原创 2013-10-24 13:54:28 · 2214 阅读 · 1 评论 -
2.2 《硬啃设计模式》 第4章 如何管理全局信息?- 单件模式(Singleton Pattern)
单件模式可能是23种模式中最简单也被说得最多的模式了。什么情况下可考虑用单件模式呢?需要一致地管理全局信息时,可考虑用单件模式。原创 2013-10-24 13:40:21 · 2168 阅读 · 0 评论 -
2.1 《硬啃设计模式》 第3章 “妞”太多,如何管理?(1)- 简单工厂
简单工厂不是23种模式中的一种,但在我们实际工作中经常会用到,简单工厂是管理“妞”(new)的最常见方法。在程序中new对象一般没有这样简单,往往要根据不同的情况new不同的对象,并且要初始化对象,我们往往将这些工作“包装”到某个方法里面,通过这个方法直接得到需要的对象。原创 2013-10-24 13:36:21 · 2044 阅读 · 0 评论 -
1.2 《硬啃设计模式》 第2章 学习设计模式需掌握的UML知识
要看懂设计模式,你需要懂类图(Class Diagram),也需要懂一点对象图(Object Diagram),本文介绍一些UML的必要知识,以便你学习设计模式,本文一共有10多个图噢!原创 2013-10-24 13:21:13 · 2326 阅读 · 0 评论 -
1.1 《硬啃设计模式》 第1章 大话设计模式
我将在优快云上陆续为大家分享《硬啃设计模式》的全部内容,先分享第1章,对设计模式来一个初级扫盲,并分享一些学习设计模式的体会和方法。本文属于扫盲级别的,老鸟请无视。后续我会针对每一种设计模式都做一些分享,谢谢!原创 2013-10-18 15:46:32 · 3540 阅读 · 2 评论 -
0.《硬啃设计模式》- 序、目录、下载方法等
无奖竞猜:上联:越看越晕;下联:越晕越看!请问横批是什么?十年前第一次听说它,觉得很神奇,先后投入了N轮的学习时间,每一轮都是越看越晕,越晕就越想看懂它!没错,这就是“设计模式”!我看的第一本设计模式书是《设计模式 可复用面向对象软件的基础》,看得晕来晕去,仅懂一些皮毛,后来让我开始有感觉的是《Head First设计模式》。通过不断地学习,不断地与实际工作联系起来,我在当时的公司准备了“设计模式”的系列课程并为同事们分享,后来我写下了一本电子书《硬啃设计模式》,打算陆续分享给大家,当然你也可以直接下载完整原创 2013-10-18 14:47:57 · 2991 阅读 · 0 评论