设计模式
文章平均质量分 90
koudaidai
这个作者很懒,什么都没留下…
展开
-
模板方法模式
要说起模板方法就要从她所从属的分类开始说起。 模板方法属于行为型设计模式,行为型设计模式主要关注对象之间职责分配和算法的问题。类行为型模式使用继承来分配类之间的职责,模板方法就是个类行为型模式。对象行为型模式使用组合来分配职责。在我们构建软件的过程中大部分时候我们都是在思考实体之间的职责,怎样的职责分配最合理,不至于过重,又不至于过轻,而且又不越权。 模板方法Gof原创 2012-03-08 15:17:08 · 606 阅读 · 0 评论 -
设计模式——备忘录模式(Memento)
作用: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。UML结构图:解析:Memento模式中封装的是需要保存的状态,当需要恢复的时候才取出来进行恢复。原理很简单,实现的时候需要注意一个地方:窄接口和宽接口。所谓的宽接口就是一般意义上的接口,把对外的接口作为public成员;而窄接口反之,把接口原创 2012-03-12 16:12:52 · 614 阅读 · 0 评论 -
设计模式——单键模式(singleton)
Singleton 模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如 C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过 Singleton 模式来实现了,可能这也正是很多公司在招聘 Java 开发人员时候经常考察 Sin原创 2012-01-11 22:12:09 · 1867 阅读 · 0 评论 -
设计模式——观察者模式(Observer )
作用:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.UML结构图:解析:Observer模式定义的是一种一对多的关系,这里的一就是图中的Subject类,而多则是Obesrver类,当Subject类的状态发生变化的时候通知与之对应的Obesrver类们也去相应的更新状态,同时支持动态的添加和删除Observ原创 2012-01-12 09:42:48 · 805 阅读 · 0 评论 -
设计模式——解析器模式(Interpreter)
意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 适用性:1、当有一个语言需要解释执行,并且你可以把该语言中的句子表示为一个抽象的语法树时,可使用解释器模式.而当存在以下情况时,该模式的效果最好:2、该文法简单,对于复杂的文法,文法的类层次变得庞大而无法管理.此时,语法分析程序生成器这样得工具时更好得选择。它们无需构建抽象语原创 2012-03-12 14:46:24 · 3936 阅读 · 0 评论 -
设计模式——终结者模式(Mediator)
定义:用一个中介对象来封装一系列的对象交互。Mediator使各对象不需要显示的相互引用,从而使其耦合松散,以便可以独立地改变他们之间的交互。说明:在软件构建过程中,经常会出现多个对象相互关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。在这种情况下,我们可以使用一个“中介对象”来管理对象间的关联关系,避免相互交互原创 2012-03-12 16:02:46 · 949 阅读 · 0 评论 -
设计模式——状态模式(State)
意图:允许一个对象在其内部状态改变时改变它的行为;对象看起来似乎修改了它的类;在一个状态即将结束的时候启用下一个状态,可以是一个按需的连锁反应;适用性:1、一个对象的行为取决于它的状态,并且它必须在运行过程中可以根据它的状态改变它的行为;2、一个操作中含有庞大的多分支的条件语句,并且这些分支依赖于该对象的状态;这个状态通常使用一个或多个枚举常量表示;通常,有多个操作原创 2012-03-12 16:22:15 · 512 阅读 · 0 评论 -
设计模式——策略模式(Strategy)
意图:定义一系列的算法,把它们都一个个地封装起来,并且使它们之间可以相互替换或切换;Strategy模式使得算法可以独立于使用它们得客户程序而变化;适用性:1、许多相关的类仅仅是行为不同。Strategy模式提供了一种用多个行为中的一个行为来配置一个类的方法;2、需要使用一个算法的不同变体。例如:你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体原创 2012-03-12 16:56:37 · 495 阅读 · 0 评论 -
设计模式——命令模式(Commend)
定义:命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。命令模式可将“动作的请求者”从“动作的执行者”对象中解耦。场景:我们要设计一个遥控器,可以通过按动上边的控制按钮控制卧室和厨房的灯,还能控制卧室中的音响的开关。遥控器及时我们的“动作的请求者”,而灯和音响就是我们的“动作的执行者”。当我们按动遥控器上的某个开关后,遥控器就可原创 2012-03-12 15:38:00 · 762 阅读 · 0 评论 -
设计模式——迭代器(Iterator)
定义:提供一种方法,以顺序访问一个聚合对象中的元素,而又不暴露该聚合对象之内部表示。使用:在软件构建过程中, 集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种结合对象上进行操作”提供了可能。使用面向对象技术,将这种遍历机制抽象为“迭代器对象”,为“应对变原创 2012-03-12 15:46:47 · 599 阅读 · 0 评论 -
设计模式——访问者模式(Visitor)
意图:表示一个作用于某对象结构中的各个元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作;适用性:1、一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作;2、需要对一个对象结构中的对象进行很多不同的而且不相关的操作,而你想避免让这些操作“污染”这些对象的类.Visitor模式使得你可以把相关原创 2012-03-12 17:52:12 · 514 阅读 · 0 评论 -
一句话评论设计模式六大原则
原则,故名思议则是本质的意思。所谓擒贼先擒王,研究设计模式自然要先了解设计原则,所有的模式都是在这些原则的基础之上发展起来的,有的是侧重一个,有的是多个都有所涉及。看完设计模式之后,我感觉到每个模式都有这些原则的影子,还渗透着面向对象的三大属性,也觉得这些原则也都有相通之处,,正是有了他们才使我们由代码工人转为艺术家。下面我来点评一下六大原则,望各位拍砖:1、单一职责原则(Single原创 2012-04-22 16:17:18 · 503 阅读 · 0 评论 -
别再让面试官问你单例(暨6种实现方式让你堵住面试官的嘴)
引子经常从Recruiter那里得到抱怨:“汤姆,为什么面试者每次回去的时候都感觉良好,而你却说此人达不到Senior级别?”我都是微笑着说:“感觉不一定都是对的哦。”Recruiter:“那你就不能问点别的么?为什么每次面试者都说你问的是单例?”我只能解释:“单例挺好的,可以问出很多基础知识哦。”Recruiter:“大叔,单例我都懂了,不就是程序运行的时转载 2012-08-09 15:30:37 · 2000 阅读 · 0 评论 -
设计模式——责任链模式(Chain Of Responsibility)
1. 意图使多个对象都有机会处理请求. 从而避免请求的发送者/接收者之间的耦合关系.这些对象将连成一条链.并沿着链传递该请求. 直到有个对象处理它.2. 动机3. 适用性有多个对象可以处理一个请求.具体是哪个对象处理请求要在运行时确定.需要在不明确指定接收者的情况下.向多个对象中的一个提交一个请求.可处理一个请求的对象的集合需要被动态指定.4. 结构原创 2012-03-12 14:14:29 · 934 阅读 · 0 评论 -
设计模式——模板方法模式(Template Method)
模板方法属于行为型设计模式,行为型设计模式主要关注对象之间职责分配和算法的问题。类行为型模式使用继承来分配类之间的职责,模板方法就是个类行为型模式。对象行为型模式使用组合来分配职责。在我们构建软件的过程中大部分时候我们都是在思考实体之间的职责,怎样的职责分配最合理,不至于过重,又不至于过轻,而且又不越权。定义在一个方法里定义算法的骨架,将一些步骤延迟到其子类。模板方法使得子类有机会重新定义原创 2012-03-12 13:56:46 · 545 阅读 · 0 评论 -
设计模式简介
面向对象设计模式让你的设计更好的符合面向对象设计的一些原则,更好的解决日益变化的软件需求。 所以我罗列出了面向对象的一些设计原则: •“开-闭”原则(Open-Closed Principle,OCP)封装的问题 一个软件实体应当对扩展开放,对修改关闭。 你添加新功能的时候应该只是向代码集中添加新的代码不应该修改原来的代码。•里氏代换原则(Liskov Substitution原创 2012-03-09 09:30:46 · 458 阅读 · 0 评论 -
设计模式——原型模式(Prototype)
概念:原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在。举个现实中的例子来介绍原型模式。找工作的时候,我们需要准备简历。假设没有打印设备,因此需手写简历,这些简历的内容都是一样的。这样有个缺陷,如果要修改简历中的某项,那么所有已写好的简历都要修改,工作量很大。随着科技的进步,出现了打印设备。我们只需手写一份,然后利用打印原创 2012-03-09 15:48:39 · 503 阅读 · 0 评论 -
设计模式——工厂模式(factory)
工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。一、简单工厂模式生活例子吃饭是人的基本需求,如果人类不需要吃饭,可能我们就能活得清闲许多,也就不需要像现在一样没日没夜的工作,学习。我们学习是为了找到更好的工作,好工作 为了赚更多的钱,最终为了吃饱饭,吃好饭。因此可以说吃饭是与人息息相关,下面就从吃饭的例子来引入工厂模式的学习。 如果你想吃原创 2012-03-09 10:28:09 · 581 阅读 · 0 评论 -
设计模式——桥接模式(bridge)
定义:将抽象部分【abstraction】与它的实现部分【implementation】分离,使它们都可以独立地变化。如画笔画画需要,大中小三种型号的蜡笔,每种型号蜡笔要12种颜色,此时需要36根蜡笔。但如果我们使用毛笔的话,需要3根大中小的毛笔,和12个颜色,此时只需要15种类。在面向对象的软件设计中,我们需要实现高内聚,低耦合。尽可能地提高系统模块内部的内聚(Cohesion) 、尽可能降低模原创 2012-01-11 21:43:09 · 1788 阅读 · 0 评论 -
设计模式——适配器模式(Adapter)
一、功能 将一个类的接口转换成客户希望的另外一个接口,解决两个已有接口之间不匹配的问题。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。它包括类适配器和对象适配器二、结构图(1)class adapter(2)object adapter三、实现和其他很多模式一样,学习设计模式的重点是学习每种模式的思想,而不应拘泥于它的某种具体原创 2012-03-09 16:40:22 · 546 阅读 · 0 评论 -
设计模式——建造者模式(builder)
一、功能将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。《大话设计模式》举了一个很好的例子——建造小人,一共需建造6个部分,头部、身体、左右手、左右脚。与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的。建造小人就是在控制下一步步构造出来的。创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。下面给出建造者模式的UML图,以建造原创 2012-03-09 16:27:18 · 454 阅读 · 0 评论 -
设计模式——享元模式(FlyWeight)
作用:运用共享技术有效地支持大量细粒度的对象。 在享元内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态,而随环境改变而改变的、不可共享的状态就是外部状态了。 享元模式可以避免大量非常相似的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够大幅度地减少需要实例化的类的数量。如原创 2012-03-11 14:24:08 · 570 阅读 · 0 评论 -
追MM与设计模式
创建型模式1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:转载 2012-03-11 14:25:36 · 416 阅读 · 0 评论 -
设计模式——合成模式(Composite)
一、功能合成模式有时又叫做部分-整体模式(Part-Whole)。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。从和尚的故事谈起这是小时候我奶奶讲的故事:从前有个山,山里有个庙,庙里有个老和尚在给小和尚讲故事,讲的什么故事呢?从前有个山,山里有个庙……。奶奶的故事要循环多少次,根据你多长时间睡着而定。在故事中有山、有庙、有原创 2012-03-10 17:18:50 · 2637 阅读 · 0 评论 -
设计模式——装饰者模式(Decorator)
一、 意图动态的给一个对象添加一些额外的职责.Decorator模式比生成子类更灵活.二、 别名包装器Wrapper三、动机就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是,将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个原创 2012-03-11 12:18:06 · 591 阅读 · 0 评论 -
设计模式——外观模式(Facade)
1. 意图为子系统中的一组接口提供一个一致的界面. 然后客户大部分时候只需要使用这个界面就可以了. 这比直接使用子系统内的各个接口要容易.2. 动机3. 适用性要为一个复杂的子系统提供一个简单的接口时. 客户程序与抽象类的实现间存在着很大的依赖性时.使用该模式可分离子系统与客户.增强独立性.4.实例外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,原创 2012-03-11 14:00:44 · 505 阅读 · 0 评论 -
设计模式——代理模式(Proxy)
代理(Proxy),首先映入大脑中的肯定是网络上为数众多的代理服务器。我们的客户机由于各种原因,不能直接连接到真正的服务器、直接访问速度慢,有的应用中甚至在代理服务器上作权限的访问控制。大部分代理服务器都有一个缓存功能,当客户机访问某内容的时候,代理服务器首先查找本地缓存里是否有这个内容,如果有则直接将其返回,否则代理服务器将向真正的服务器发送请求,将真正的服务器的响应内容发送给客户端而且将这个内原创 2012-03-12 10:46:52 · 483 阅读 · 0 评论 -
面试中的Singleton
引子 “请写一个Singleton。”面试官微笑着和我说。 “这可真简单。”我心里想着,并在白板上写下了下面的Singleton实现: 1 class Singleton 2 { 3 public: 4 static Singleton& Instance() 5 { 6 static Singleton singlet转载 2012-08-09 15:56:28 · 1119 阅读 · 0 评论