设计模式
文章平均质量分 92
学习23种设计模式,总结归纳实践案例
会很甜
渐行渐远渐无书,水阔鱼沉何处问
展开
-
设计模式概述
成为一名优秀的软件开发工程师,设计模式的重要性不言而喻,本章节是对设计模式的前置知识概述,涉及概念性较大,读者可在设计模式学习过程中参阅本文档。在第一章节,主要介绍软件设计的七大原则,接着在第二章我们简要介绍设计模式的三种分类,让我们站在一定的高度对设计模式有整体的把握,第三章UML类图帮助我们更好的看懂设计模式的代码。原创 2019-07-30 20:56:07 · 459 阅读 · 11 评论 -
设计模式-原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式本质是一种克隆对象的方法,其核心是重写Object中的clone方法,调用该方法可以在内存中进行对象拷贝。Java提供了一个标记接口——Cloneable,实现该接口完成标记,在JVM中具有这个标记的对象才有可能被拷贝。如果不实现该接口,克隆对象会抛出CloneNotSupportedException异常。原型模式可以理解为:一个对象的产生可以不由零起步,直接从一个已经具备一定雏形的对象克隆,然后再修改为生产需要的对象。原创 2019-08-31 10:09:00 · 17809 阅读 · 8 评论 -
设计模式-访问者模式
当你有个类,里面的包含各种类型的元素,这个类结构比较稳定,不会经常增删不同类型的元素。而需要经常给这些元素添加新的操作的时候,考虑使用此设计模式。适用对象结构比较稳定每增加一个元素访问者都要大变动,但加新的操作很简单。集中相关的操作、分离无关的操作。缺点只有两个字-复杂,号称是最复杂的设计模式。原创 2019-08-31 10:20:36 · 8809 阅读 · 4 评论 -
设计模式-模板方法
模板方法应用场景太普遍了,在实际开发中有多个子类共有的方法,并且逻辑相同,可以考虑使用模板方法模式。当面对重要、复杂的算法,也可以把核心算法设计为模板方法模式,相关细节则由各个子类实现。模板方法优点突出:封装不变部分,扩展可变部分;提取公共代码,便于维护;行为由父类控制,子类实现。模板方法的缺点很明显,当方法实现过多的时候,每一个不同的实现都需要一个子类来实现,这必然导致类的个数增加,使得系统变得更加庞大。原创 2019-08-31 10:39:23 · 2254 阅读 · 6 评论 -
设计模式-状态模式
在实际开发中,当控制一个对象状态转换的条件表达式过于复杂时,就可以使用状态模式把相关“判断逻辑”提取出来,用各个不同的类进行表示。系统处于哪种情况,直接使用相应的状态类对象进行处理,这样能把原来复杂的逻辑判断简单化,消除了 if-else、switch-case 等冗余语句,代码更有层次性,并且具备良好的扩展力。原创 2019-09-13 19:57:41 · 243 阅读 · 11 评论 -
设计模式-备忘录模式
备忘录模式是怎么回事想必你已经明白了,如果我们在实际开发中有一个对象的功能很复杂,属性非常的多,这时候备忘录模式就是一个好的选择。备忘录模式实现也很简单,在原对象基础之上再增加一个副本对象,在原对象上额外的增加两个方法,用于构建一个副本和从副本中取值。再创建一个栈对象,用于存储、管理副本。备忘录模式的优势突出,会简化发起人(原对象)的职责,隔离存储状态,实现信息的封装,客户端无须关心保存细节,而且提供了状态回滚功能。原创 2019-09-13 20:48:06 · 7850 阅读 · 18 评论 -
设计模式-中介者模式
网上讲解设计模式的文章很多,能把中介模式讲清楚很简单,但能说明白何时使用合适的设计模式却是难上加难。在前三章设计模式的基础之上,第四章总结看完,希望读者能对正确使用设计模式有一个清晰的轮廓。很多网上的博客都说要职责清晰才可使用中介者模式,如果类的职责是混乱的,那中介者的逻辑写起来就很难受。还有多个对象间耦合严重,类图之间出现了网状结构,这时候就可以考虑中介者模式了,如果仅仅是为了使用中介者模式而使用,那就得不偿失了。中介者的优点突出,中介者模式的出现会让网状结构,有序的转化为星状结构。原创 2019-10-26 10:34:30 · 212 阅读 · 11 评论 -
设计模式-迭代器模式
当一个对象是一个聚合对象且需要对外提供遍历方法时,可以使用迭代器模式,也即实际业务中定义的有聚合对象,里面存放了我们需要的业务数据,为了让业务数据的职责更清晰,我们就可以将编辑的方法提取出来,另外定义一个迭代器对象用于遍历数据。迭代器方式提供了不同的方式遍历聚合对象,增加新的聚合类和迭代器类都是比较方便的,Java集合类中庞大的家族采用迭代器模式就是基于这种优点。迭代器模式有设计模式的通用缺点——系统复杂性,迭代器模式将数据存储和数据遍历分开,增加了类的个数。原创 2019-11-30 20:49:25 · 2092 阅读 · 7 评论 -
设计模式-解释器模式
抽象表达式类,声明了抽象的解释操作,所有解释器类都继承或实现该类。原创 2019-12-31 19:16:03 · 454 阅读 · 6 评论 -
设计模式-命令模式
优点很明显,解耦了命令请求与实现,很容易的可以增加新命令,支持命令队列。但是,这样会不可避免的使具体命令类过多,增加了理解上的困难。设计模式学到这种程度,我们就会发现设计模式不是一种单一的技术,而是各种技术的综合体。我们在学习设计模式的时候一定不要仅局限于一种模式,而是站在一定的高度去整体衡量哪种设计模式才是最优的。有时候我们会发现,使用设计模式会让我们的代码变得更加的复杂,但以自己目前的开发经验又不能确定是否采用设计模式是一个好的选择。原创 2019-12-31 19:25:54 · 297 阅读 · 8 评论 -
设计模式-享元模式
享元模式与我们常说的缓存的概念很相似,总体来说还是一个很简单的设计模式,在我们实际使用中为了提高对象利用率,可以有意识的使用这种模式。到这里,设计模式的第二个大家族-结构形设计模式就介绍完了,万丈高楼平地起,若想灵活的使用设计模式,大量的思考和运用是必不可少的。原创 2019-12-31 19:39:01 · 196 阅读 · 6 评论 -
设计模式-外观模式
关于设计模式在新手期要不要学的问题,一些人的观点就是新手压根看不懂设计模式,看懂了实际开发也不会用。另外一派的观点则是,设计模式一定要学,在你开发中慢慢训练有意识的使用设计模式,在你开发了一段时间的系统后再学习设计模式的话,那时候你压根没有时间去重构你的代码。我的观点更趋向于后者,自从我学了设计模式以后,再写代码的时候,尤其是在老代码之上加一些新功能时,我会下意识的回忆一下学过的设计模式,思考使用设计模式对我的代码有没有帮助。原创 2019-12-31 19:55:54 · 3065 阅读 · 9 评论 -
设计模式-装饰器模式
到此为止,我们就将装饰器模式的内容讲解清楚了,看到这读者可能发现,针对某一类需求可能会有很多设计模式都能完成需求,但一定是有最合适的那一个,就像我们今天举的例子无论是用装饰器模式还是代理模式都可以实现这个需求。但我们看代理模式中我们列举的例子是以租房做例子,中介将房子的权利完全移交过去,中介完全控制房子做一些改造,今天书房的需求只是让小王来帮忙的,还是以老王为主体,小王只是做一些附加。装饰器模式就是在瓶里面插了一朵花,而代理模式是把瓶子都给人家了,让人家随便折腾。原创 2020-05-30 11:05:24 · 459 阅读 · 9 评论 -
设计模式-组合模式
组合模式也就介绍完了,这种模式的优缺点都非常的明显,优点就在于清楚的定义分层次的结构,在调用时忽略他们之间的差异,方便对整个层次进行控制,但是组合模式会违反依赖倒置原则。理解是一回事,在实际应用中能正确的使用它就是另外一回事了。读者要对每种设计模式都能做到心中有数,当我们在实际编程中,在潜意识里有各个设计模式的大体轮廓,参考代入进各种设计模式中,对于简化开发和易于维护性有没有好的帮助,选择一个最优的设计模式。原创 2020-05-30 11:10:47 · 311 阅读 · 9 评论 -
设计模式-桥接模式
桥接模式是很好理解的,相信认真看了实例的同学应该都可以看懂,但那并不代表你已经掌握了该设计模式。在我们使用JDBC的时候,想必有很多同学并不能看出来这是桥接模式。纸上得来终觉浅,有一部分例子是为了说明桥接模式而“构想”出来的,各个角色都是清晰直观。看了这样的代码,可以学会桥接模式,但是到了实际中很可能还是不会用。最好的方法就是给出真实项目里的例子。但是这个难度确实很大,一到了真实项目里,就会遇到很多细节问题,从而影响对模式的理解,而且真实项目都带有一定的业务环境。原创 2020-05-30 11:14:11 · 319 阅读 · 12 评论 -
设计模式-适配器模式
既然适配器模式可以扩展原有类的功能,那它和代理模式在一定程度上不是重合了吗?貌似扩展老王的书架使用代理模式同样是可以实现。其实我们看结构型设计模式的定义:结构型模式涉及到如何组合类和类以获得更大的结构,结构型类模式采用继承机制来组****合接口或实现。代理模式与适配器模式都分别有继承、接口方式实现的子分类模式。基于接口实现的代理模式称为静态代理模式、JDK(动态)代理模式,基于继承实现的代理模式称为Cglib(动态)代理模式。原创 2020-05-30 11:15:30 · 292 阅读 · 12 评论 -
设计模式-建造者模式
我们可以看到,工厂模式和建造者模式用属于创建型设计模式,最终目的都是创建对象,那他们之间有什么区别呢?在实际运用时又如何选择呢?其实对比工厂模式,我们举的例子是老王购买产品A、B、C看名字就像是批量生产,而且我们并没有说构建过程,就像是工厂生产产品一样。而我们这篇文章举的例子却是电脑这么具体且复杂的产品,且更注重每一步的组装过程,看到这我们模模糊糊能感受到他们之间的区别。①工厂模式创建对象无需分步骤,获取的产品对象完全一样;原创 2020-08-31 19:41:56 · 616 阅读 · 14 评论 -
设计模式-代理模式
本文由老王出租房子引出——代理设计模式,将从最简单的静态代理实现开始,后延伸使用jdk实现动态代理,最后扩展到Cglib实现动态代理。为了更深入理解代理模式,我们会对实际应用中的典型案例进行介绍,包括在Spring和Mybatis中的应用。读者可以拉取完整代码到本地进行学习,实现代码均测试通过后上传到。原创 2020-11-30 21:23:13 · 4576 阅读 · 13 评论 -
设计模式-策略模式
策略模式 定义:策略模式就是定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中,从而使它们可以相互替换让算法可在不影响客户端的情况下发生变化,提高了系统的灵活性. 策略简单的说,就相当于我们出门到某一地点的时候,选择不同的出行方式,比如骑自行车,做公交,坐汽车,坐火箭等等,每一种方式都是一个策略. 再比如,我们日常的网上购物有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换...原创 2020-11-30 17:25:51 · 4269 阅读 · 17 评论 -
设计模式-责任链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.原创 2020-11-30 21:25:26 · 3936 阅读 · 13 评论 -
设计模式-观察者模式
Spring使用观察者模式我在很久之前就使用过,但是并不清楚为什么要这样写,学了观察者模式以后,写起来变得通透多了。虽然观察者模式的概念是:一对多的依赖关系,但不一定观察者有多个才能使用,我们的例子都是使用的一个观察者。它很好的降低了目标与观察者之间的耦合关系,目标与观察者建立一套触发机制,也让他成为了最常见的设计模式。原创 2020-11-30 20:53:45 · 3866 阅读 · 10 评论 -
设计模式-单例模式
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。原创 2020-08-31 22:03:22 · 247 阅读 · 17 评论 -
设计模式-工厂方法和抽象工厂
全网最详细的工厂设计模式,本文主要是创建型设计模式中的工厂方法和抽象工厂,先由传统实现方式引出问题,接着对代码改进到简单工厂,后扩展到工厂方法,最后是抽象工厂模式,文中包括概念理解和相关实现代码。原创 2020-08-31 21:32:38 · 221 阅读 · 16 评论