设计模式
23种设计模式理解及实现
夜勿语
热爱技术,分享技术,博客园地址:https://www.cnblogs.com/yewy/
展开
-
设计之禅——访问者模式
引言访问者模式是遵循单一职责原则,将行为和属性分离的一种设计模式,它可以在不改变元素结构的前提下定义元素新的操作。类比到现实当中就像博物馆,它是固定不变的,其中有各种各样的展品,而我们就是访客,可以是参观、可以是打扫、也可以是管理。同样访客模式正是具有了这样一个特点。正文访客模式含有五大角色,分别是:抽象元素(AbstractElement):抽象类或接口,定义一个accept方法,供访...原创 2019-05-11 21:02:00 · 551 阅读 · 0 评论 -
设计之禅——备忘录模式
引言备忘录模式是非常简单的一种模式,应用场景非常广泛,如编辑器的ctrl + z、数据库事务的回滚、游戏的存档等等都符合该模式的思想——备份(比较疑惑为什么叫备忘录模式,叫备份模式不是更贴切么?)。详解备忘录模式就是将一个对象的内部状态保存到对象的外部,这样,在将来的任一时间点都可以恢复到之前的状态,让我们有后悔药可以吃。它包含了发起人(originator)、备忘录(memento)、负责...原创 2019-05-04 18:41:05 · 489 阅读 · 0 评论 -
设计之禅——中介者模式
引言在面向对象编程中,无可避免的是对象之间的引用,引用给我们带来便捷(对象的复用),但同时也会给类与类之间造成强依赖关系。在一对一的关系中,这看起来并不会造成什么不良的影响,但若是在一对多中,修改任意的一个对象,都会影响到其它调用者,形成强耦合。模式定义如同上面的图,当对象之间形成网络结构之后,改变5号对象只会影响到4号对象,改变1号对象,其引用它的4、5、6号对象都需要作出相应的改变,而...原创 2019-05-03 18:34:30 · 541 阅读 · 0 评论 -
设计之禅——解释器模式(译文)
前言解释器模式在平时基本上用不到,因此笔者也不打算花太多精力在这上面,但强迫症使然,所以翻译了GeeksForGeeks上面的一篇文章,本文采取意译及注解方式,原文链接Interpreter Pattern译文解释器模式是一种行为型模式,它提供一个解析特定语法规则的解释器。该模式包含一个表达式接口,该表达式族用来解析一些特定的语法规则。此模式常用于sql解析、符号解析引擎等。该模式执行...翻译 2019-02-13 13:53:21 · 535 阅读 · 0 评论 -
设计之禅——享元模式
引言之前已经写了17篇关于设计模式的文章,而这些设计模式大都是为了降低代码之间的耦合,避免违反开闭原则,但它们大都有同样的一个缺点,产生更多的类和对象,如果数量达到一定程度,就会导致系统性能降低,而今天要讲的这个模式就是为了解决这样的一个问题,他就是享元模式。正文定义享元模式是为了尽可能的达到细粒度对象的复用,减少内存资源的占用而出现的,因而它是一种优化系统性能的模式。为什么是细粒度...原创 2019-02-12 20:38:20 · 671 阅读 · 0 评论 -
设计之禅——责任链模式
引言在平时开发中如果遇到需要由多个不同的类对象来处理同一个请求时,你会怎么做呢?if (condition) { object1.invoke();} else if (condition1) { object2.invoke();} else if (condition2) { object3.invoke();} ....是像我这样么,满屏的if else。稍有经验的开发人...原创 2019-02-11 17:57:16 · 675 阅读 · 0 评论 -
设计之禅——桥接模式
前言桥接模式也是经典的23种模式之一,不过在《HeadFirst设计模式》书中只对其做了一个简短的描述,本文则是根据网络上的博客得出的个人理解和总结。正文定义在维基百科上是这样定义桥接模式的:桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。桥接模式被列为最复杂的模式之一,它的复杂不在于代码的实现上,而是在于在软件设计之...原创 2019-02-10 19:55:49 · 713 阅读 · 0 评论 -
设计之禅——原型模式
前言“万事万物皆对象!”,这是面向对象的宗旨,在Java中我们无时无刻不在创建对象,那创建对象有哪些方式呢?可以通过new或者反射,还有就是今天要讲的原型模式。那什么是原型模式,为什么又要通过原型模式去创建对象呢?正文无论是通过new还是反射,我们都免不了要去手动设置其属性,如果类结构非常复杂,同时又需要创建大量相似的对象时,如果还老老实的去new就非常麻烦易出错了,而原型模式则是使用clo...原创 2019-02-09 19:33:16 · 588 阅读 · 0 评论 -
设计之禅——组合模式
引言昨天我写了一篇迭代器模式的文章,其中用到餐厅菜单的例子,如果你细想过,肯定是能发现一些问题的,比如昨天的菜单中只有一级菜单(不清楚的同学可以先看看我上一篇文章,但这只是一个引子,并不影响后面的阅读),那当某些餐厅需要往自己的菜单中添加子菜单列表(比如甜品),之前实现的迭代器就无法正确工作了,因此我们需要新的模式来解决这个问题,也就是今天的主角——组合模式。定义回到问题的本质,为什么添加甜...原创 2019-02-08 18:03:35 · 654 阅读 · 0 评论 -
设计之禅——迭代器模式
前言迭代器想必大家不会陌生,作为Java中内置的API,平时我们使用的也是非常多的。但你是否曾想过它和迭代器模式有什么关联?并且Java中已经有for循环遍历,为什么还会需要这样一个类?定义Java中大部分的数据结构都有返回iterator的方法,且都实现自Java.util.Iterator接口,这就是迭代器模式的实现和应用。那迭代器模式是什么?有什么用呢?迭代器模式提供一种方法顺序访...原创 2019-02-07 19:49:33 · 656 阅读 · 0 评论 -
设计之禅——状态模式
前言之前我写过一篇策略模式的文章,讲的是如何灵活地改变对象的行为,今天要讲的模式和策略模式非常像,它也是让你设计出如何灵活改变对象行为的一个模式,与策略模式不同的是它是根据自身状态而自行地改变行为,它就是状态模式。详解普通实现首先我们来分析一个实例:现在的游戏基本都有自动打怪做任务的功能,如果让你实现这个功能你会怎么做呢?本篇讲解的是状态模式,当然首先应该分析其应有状态和行为,下面是我画...原创 2019-02-06 21:25:06 · 636 阅读 · 0 评论 -
设计之禅——外观模式
概述平时在我们生活中,我们常常会接触学习各种各样的新事物,而能够快速吸引留住大量客户的都有一个共性,就是简单易学好上手。比如,windows和linux系统,前者比后者更加普及的原因也就是不需要经过专业系统的学习就能轻松使用。同样的,这种思想在编程界有一个专业的术语——外观模式。定义首先我们来看看它的定义:外观模式定义了一个统一的接口,用来访问子系统中的一群接口,使得子系统更容易使用。...原创 2019-02-05 18:45:10 · 614 阅读 · 0 评论 -
设计之禅——适配器模式
概述对于适配器相信大家不会陌生,生活中有各种各样的例子,像耳机转接线,充电器适配器,水管适配接口等等。通过类比我们很容易理解适配器的作用:将已有的本无法使用的类通过适配器转换,从而达到资源复用,节省开销的目的。那要如何通过代码实现这一点呢?既然要将被适配者转换为目标接口类,那么适配器肯定是要实现自该接口的,以保证类型、行为的一致,但要如何转换呢?很简单,只需要通过继承或组合被适配者就能轻...原创 2018-12-08 23:20:35 · 464 阅读 · 0 评论 -
设计之禅——我只要结果(命令模式)
前言生活中我们会接收到各种各样的命令,也会发出各种各样的命令,虽然命令的事情都各不相同,但是都具有一个共同的特质,那就是对于发出命令的人而言他不需要知道你是怎么实现的,他只要得到结果就行了,相信大家都会常听到BOSS这样对自己说(当老板真好啊!)。那么,我们在写程序时,如果能将请求的调用和请求的执行解耦,对于客户端而言就不用再关心后台复杂的实现逻辑了,因此,命令模式也就应运而生。概述命令模...原创 2018-12-01 23:08:34 · 616 阅读 · 0 评论 -
设计之禅——装饰者模式详解(与代理模式的区别以及与其他模式的组合)
前言相信很多初学者都对JavaAPI中的IO包感到头大,其中的类非常多,看着看着就晕了,笔者也是一样。不过,IO包的设计其实就是使用了装饰者模式,了解了这个模式再去看IO包就会发现很清晰了。定义CodingCommonWithFactoryIO包中的装饰者与代理模式的区别总结...原创 2018-11-26 23:03:30 · 2452 阅读 · 0 评论 -
设计之禅——生成器模式
概述Java是一门面向对象的语言,所以在使用它的时候我们首先就需要new一个对象,在创建一个简单对象new当然是没有任何问题的,但是在实际项目中我们往往需要构建一个个复杂的对象,且当某个对象需要多次创建时,我们再通过new去创建,不仅会产生大量冗余代码,而且极不利于维护(想象一下,某个多处被引用的对象需要修改内部属性,那么所有创建对象的代码都需要改变,简直是场灾难)。因此,生成器模式就出现了。...原创 2018-11-23 08:15:38 · 641 阅读 · 0 评论 -
设计之禅——观察者模式
引言观察者模式也是非常好理解的模式之一,因为在生活中很容易找到类比,比如报纸、书刊订阅,手机app消息通知等等,所以仅通过名字大致也就能明白这个模式的作用。不过,从代码的层次来讲却有非常多的细节需要注意。定义观察者模式定义了对象之间的一对多关依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新。通过以上定义我们不难发现观察者模式一定存在两个角色,一个是被观察的对象...原创 2018-11-18 17:24:49 · 768 阅读 · 0 评论 -
设计之禅——灵活的策略模式
一、引言在平时生活中当我们想要做一件事的时候往往会有许多的途径和方法,像我们去公司上班,可以走路去,也可以骑车或者开车去;还有像吃饭,我们可以选择自己做饭吃,也可以出去吃,脸长得好看的还能让人请吃饭等等,但无论选择哪种方式,我们最终达到的目的结果都是一样的,只是过程不一样。在面向对象的程序设计中,我们就可以把这种变化的行为隔离封装,实现代码的高度扩展和复用,也就是我今天要讲的策略模式。二、什么...原创 2018-11-03 21:04:27 · 701 阅读 · 0 评论 -
设计之禅——模板方法模式
一、 前言原创 2018-10-21 19:55:19 · 576 阅读 · 0 评论 -
设计之禅——工厂方法
一、工厂大观我们生活中有许许多多的工厂,为商家提供产品,而我们开发者口中所谈论的工厂方法模式产生灵感也是来源于此,结合生活中的实例我们可以非常轻松的理解该模式。它是一种创建型设计模式,也是项目开发中用的最多的设计模式之一,用于对象的创建。二、走进工厂在我们平时开发时,常常会用到“new”来创建实例,但你是否想过所有的对象都通过我们自己手动创建有什么问题?比如你的代码中嵌入了类似下面这样的代码...原创 2018-10-03 21:46:48 · 457 阅读 · 0 评论 -
设计之禅——单例模式详解
一、前言有时候我们只需要一个类只有一个对象,如,线程池、缓存、windows的任务管理器、注册表等,因此就有了单例模式,确保了一个类只存在一个实例。单例模式的实现非常简单,但是其中的细节也需要注意。下面我们就来看看他的各种实现。二、实现单例模式的实现方式有很多,根据是否立即创建对象分为“懒汉”和“饿汉”两大类别,即是否在类加载时立即创建对象,如果该对象频繁被使用,可以使用“饿汉式”提高效率;...原创 2018-09-23 11:09:33 · 515 阅读 · 0 评论 -
设计之禅——深入剖析代理模式
一、前言 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。以上内容摘自百度百科。设计模式的重要性相信不用阐述了,在笔者看来,代码是一门艺术,设计模式则是完成这门艺术的必要骨...原创 2018-09-10 22:03:54 · 1111 阅读 · 0 评论