设计模式实战
主要记录自己学习设计模式时的思考
有心好书
种一棵树最好的时间是十年前,其次是现在
展开
-
设计模式系列:桥梁模式
一.名称二.问题(为了解决什么问题)一个对象有多个维度的变化,需要将这些维度抽离出来,让其独立变化设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:第一种设计方案是为每一种形状都提供一套各种颜色的版本。 第二种设计方案是根据实际需要对形状和颜色进行组合 对于有两个变化维度(即两个变化的原因)的系原创 2016-02-29 15:53:43 · 1950 阅读 · 0 评论 -
设计模式系列:享元模式
一.名称二.问题(为了解决什么问题)系统中存在大量相似的对象 需要缓冲池的场景三.解决方案(主要体现在uml和核心代码上) 享元模式是池技术的重要实现方式,定义:使用共享对象可有效的支持大量的细粒度的对象。 仅仅是一个优化性能的解决方案. 在享元模式中,存储这些共享对象的地方成为享元池。 学习享元模式的关键是区分内部状态和外部状态。类图内部状态和外部状态内部状态是存储在享元原创 2016-02-29 15:53:20 · 1014 阅读 · 0 评论 -
设计模式系列:解释器模式
一.名称二.问题(为了解决什么问题)在以下情况下可以使用解释器模式:有一个简单的语法规则,比如一个sql语句,如果我们需要根据sql语句进行rm转换,就可以使用解释器模式来对语句进行解释。 一些重复发生的问题,比如加减乘除四则运算,但是公式每次都不同,有时是a+b-cd,有时是ab+c-d,等等等等个,公式千变万化,但是都是由加减乘除四个非终结符来连接的,这时我们就可以使用解释器模式。三.解决方案原创 2016-02-29 15:52:06 · 987 阅读 · 1 评论 -
设计模式系列:状态模式
一.名称二.问题(为了解决什么问题) 在以下情况下可以使用状态模式:• 对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为。 • 代码中包含大量与对象状态有关的条件语句,这些条件语句的出现,会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态,使客户类与类库之间的耦合增强。在这些条件语句中包含了对象的行为,而且这些条件对应于对象的各种状态。 状态模式在工作流或游戏原创 2016-02-29 15:51:39 · 1011 阅读 · 0 评论 -
设计模式系列:访问者模式
一.名称二.问题(为了解决什么问题)三.解决方案(主要体现在uml和核心代码上)访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。例如处方单中的各种药品信息就是被访问的元素,而划价人员和药房工作人员就是访问者。访问者模式使得用户可以在不修改现有系统的情况下扩展系统的功能,为这些不同类型的原创 2016-02-29 15:48:59 · 991 阅读 · 0 评论 -
设计模式系列:备忘录模式
一.场景保存和恢复状态或操作时,可以使用这个模式,例如游戏中的保存点。二.定义及体现了什么设计原则定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在改对象之外保存这个状态,这样以后就可将对象恢复到原先保存的状态。三.类图或时序图四.代码多状态的备忘录/** * Created by annuoaichengzhang on 16/3/23. */public class Origina原创 2016-02-29 15:48:44 · 924 阅读 · 0 评论 -
设计模式系列:门面模式
引入大家有没有比较过自己泡茶喝去茶馆喝茶的区别呢?自己泡茶需要自行准备茶叶、茶具和开水,而去茶馆喝茶,最简单的方式就是跟茶馆服务员说想要一杯什么样的茶(铁观音、碧螺春等等)。正因为茶馆有服务员,顾客无须直接和茶叶、茶具、开水等交互,整个泡茶过程由服务员来完成,顾客只需与服务员交互即可,非常简单省事。外观类就充当了软件系统中的“服务员”角色,它为多个业务类的调用提供了统一的入口,简化了类与类之间的交互原创 2016-02-29 15:48:17 · 971 阅读 · 0 评论 -
设计模式系列:观察者模式
一.名称二.问题(为了解决什么问题)很好辨认,举一些常见的例子: 猫鼠游戏 广播收音机 事件监听等等三.解决方案(主要体现在uml和核心代码上)定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。其实观察者模式的更细节的1对1就是接口回调。扩展: java中已经帮我们定义了观察者和被观察者的接口,我们只需要直接实现即可。观察者模式体现原创 2016-02-29 15:47:50 · 1155 阅读 · 1 评论 -
设计模式系列:组合模式
一.名称二.问题(为了解决什么问题)比较好辨别,因为使用范围很窄当有一个结构可以组合成树形结构,且需要向客户端提供一致的操作接口,使得客户端操作忽略简单元素与复杂元素,如维护和展示部分-整体关系的场景,如树形菜单、文件和文件夹管理。从一个整体中能够独立出部分木块或功能的场景。当有一个结构可以组合成树形结构,且需要向客户端提供一致的操作接口,使得客户端操作忽略简单元素与复杂元素三.解决方案(主原创 2016-02-29 15:47:23 · 2671 阅读 · 0 评论 -
设计模式系列:迭代器模式
迭代器模式原创 2016-02-29 15:46:54 · 736 阅读 · 0 评论 -
设计模式系列:适配器模式
一.名称二.问题(为了解决什么问题)适配器最好在详细设计阶段不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题,是一个“补救”模式。解决兼容问题。 场景:系统扩展时,需要使用一个已有的类,但这个类又不符合系统的接口,怎么办?使用适配器模式。需要使用一个类的功能,但是该类的接口不符合使用场合要求的接口,可使用定制适配器,又或者是有一个接口定义的行为过多,则可以定义一个缺省适配原创 2016-02-29 15:46:28 · 780 阅读 · 0 评论 -
设计模式系列:策略模式
一.引入1.案例计算a+b, a-b2.面向实现编程方案定义一个Calcuate类,里面有两个方法,一个加法,一个减法3.面向设计编程方案把加法和减法封装成两个类二.场景1.应用场景:多个类只有在算法或行为上稍有不同的场景。 算法需要自由切换的场景。 需要屏蔽算法规则的场景。2.策略模式的优点如下:策略模式提供了管理相关的算法族的方法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把原创 2016-02-29 15:45:43 · 913 阅读 · 0 评论 -
设计模式系列:装饰者模式
一.引入1.案例 比如,三个继承关系:Father,Son,GrandSon三个类,我要在son类上增加一些功能怎么办?2.面向实现编程方案 修改Son,这种方案会有大问题,因为你增强的功能是是修改Son的方法还是增加Son的方法,是否会对GrandSon造成影响呢?3.面向设计编程方案 通过建立SonDecorator类来修饰Son类,相当于创建了一个新的类,这个对原有程序没有改变,通过扩展原创 2016-02-28 18:04:15 · 921 阅读 · 0 评论 -
设计模式系列:责任链模式
引入1.案例2.面向实现编程方案首先来看一段代码: public void test(int i, Request request){ if(i==1){ Handler1.response(request); }else if(i == 2){ Handler2.response(request); }原创 2016-02-28 18:03:55 · 937 阅读 · 0 评论 -
设计模式系列:命令模式
引入1.案例2.面向实现编程方案 如果我们用面向事项的方式来实现的话:会直接让调用者(invoker)和每个接受者(recevier)之间交互,产生耦合.3.面向设计编程方案 命令模式主要的就是在他们中间增加一层,命令层,来隔开这两者之间的交互,调用者和命令之间交互,命令再去调用具体的接受者来执行命令。一.名称二.问题(为了解决什么问题)在以下情况下可以使用命令模式: • 系统需要将请求调用者原创 2016-02-28 18:03:38 · 918 阅读 · 0 评论 -
设计模式系列:中介者模式
一.引入1.案例:假设计算机1,2,3,4之间要相互通信。2.面向实现编程方案:类Computer1中要保存类Computer2、类Computer3和类Computer4实例,才能调用Computer2、Computer3、Computer4方法中的Comunicate方法。 。。。 。。。 。。。 具体图示如下: 3.面向设计编程方案:建立一个中介者,保有类Computer1,类Com原创 2016-02-28 18:02:59 · 2208 阅读 · 0 评论 -
设计模式系列:原型模式
一.场景 创建新对象成本较大(如初始化需要占用较长的时间,占用太多的CPU资源或网络资源),新的对象可以通过原型模式对已有对象进行复制来获得,如果是相似对象,则可以对其成员变量稍作修改。二.定义及体现了什么设计原则 原型模式的简单程度仅次于单例模式和迭代器模式。正是由于简单,使用的场景才非常的多。 java中怎么实现原型模式: 实现Cloneable接口 重写Object类中的clon原创 2016-02-28 18:02:36 · 790 阅读 · 0 评论 -
设计模式系列:代理模式
一.名称二.问题(为了解决什么问题)我相信第一次接触代理模式的读者肯定非常郁闷,为什么要用代理呢?我们来想想现实世界,打官司为什么要找一个律师?因为你不想参与中间过程的是是非非,只要完成自己的答辩就可以了,其他的比如事前调查、事后追查都由律师来搞定,这就是为了减轻你的负担。代理模式的使用场景非常多,大家可以看看spring AOP,这是一个非常典型的动态代理。在软件开发中,由于某些原因,客户端不想或原创 2016-02-28 18:01:58 · 972 阅读 · 0 评论 -
设计模式系列:建造者模式
一.场景 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。 通俗示例:在很多游戏软件中,地图包括天空、地面、背景等组成部分,人物角色包括人体、服装、装备等组成部分,可以使用建造者模式对其进行设计,通过不同的具体建造者创建不同类型的地图或人物。二.定义及体现了什么设计原则 建造者模式将一个复杂原创 2016-02-28 18:01:29 · 1285 阅读 · 0 评论 -
设计模式系列:模板方法模式
一.名称二.问题(为了解决什么问题)三.解决方案(主要体现在uml和核心代码上) 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义改算法的某些特定步骤。 主要体现了依赖倒置,里氏替换,开闭原则。这主要做的也是增加了一层实现了解耦和复用。 抽象类和继承——依赖倒置 抽象类——开闭原则 抽象类——里氏替换原则模板方法模式经常和其他设计模式原创 2016-02-28 18:01:05 · 753 阅读 · 0 评论 -
设计模式系列:抽象工厂模式
一.名称 抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。 例如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电器厂1生产电视机类型1和电冰箱类型1,海尔电器厂2生产电视机类型2和电冰箱类型2,这个时候就必须要用抽象工厂模式了,工厂方法模式已经无法处理这种情况了。 体现了:依赖倒置,开放封闭,单一职责,接口隔原创 2016-02-28 18:00:39 · 936 阅读 · 0 评论 -
设计模式系列:工厂方法模式
一.名称体现了:依赖倒置,开放封闭,单一职责,接口隔离,迪米特法则,里氏替换原则。体现了所有的设计原则。 抽象类和继承——依赖倒置 抽象类——开闭原则 类间解耦——迪米特原则 抽象类——里氏替换原则工厂方法模式主要通过增加抽象层来实现解耦。这个是这个模式的核心。二.问题(为了解决什么问题)提升扩展性,就可以考虑工厂模式,异构项目间使用工厂模式,可以屏蔽底层变化。客户端只知道传入工厂类的参原创 2016-02-28 18:00:12 · 1089 阅读 · 0 评论 -
设计模式系列:单例模式
单例实现原创 2016-02-28 17:59:29 · 3758 阅读 · 0 评论 -
设计模式系列:概论
对于普遍的程序员来说,设计模式并不新鲜。网上、书店可以找到各种设计模式的资料。很多的公司招聘技术人员都把它作为一个衡量标准。自己最近阅读了n本设计模式相关的书籍、也查找了一些网上的资料,在与同事的交流中,体会较深。打算写一系列的博客来分享自己的技术体会和心得。 本系列博客的重心:实例讲解,对每个案例都会从面向实现编程和面向设计编程两个角度来分析设计模式的优势。网上和书上讲解较少的知识。尽量少讲原创 2016-02-05 16:13:27 · 1149 阅读 · 0 评论