设计模式
以《Head First 设计模式》为参考,跃哥带你拆解设计模式,一探究竟
程序员小跃
前杭州华为Android工程师,现游戏公司Java后端主程。专注于以 Java 为中心扩展的校招、职场、编程技术进阶,和优秀的你一起学习。
展开
-
设计模式之欢迎来到设计模式世界(一)
亲爱的朋友,欢迎你来到对象村,开始走进设计模式的世界。这里的每个人都很熟练的使用设计模式,很快我和你们一起,都会学习的很好,通过设计模式,跻身上流社会。 计划每一章节的学习,通过几个篇幅来完成,理论+实践的方式。书中很多地方用到了图形表示,小编尽量用图文的方式和大家互动。先用理论建立知识,再用图形象地描述巩固学习。每篇文章给出书中的思考题和大家互动,在后文给出答案。力争让没读过此书的朋友也能有个理...原创 2019-03-20 21:41:51 · 127 阅读 · 0 评论 -
设计模式之命令模式(二)
上一次留给大家去做的实践,不知道大家执行的怎么样了呢。 我们通过一个简单的练习,完成了一个控制开关。那现在,我们打算将遥控器的每个插槽,对应到一个命令这样就要遥控器变成“调用者”。当按下按钮,相应命令对象的execute()方法就会被调用,其结果就是,接收者(例如电灯、风扇、音响)的动作被调用。 实现遥控器 publicclassRemoteControl{Comm...原创 2019-05-15 13:52:01 · 122 阅读 · 0 评论 -
设计模式之命令模式(一)
在本次学习过程中,我们把封装带到一个全新的境界:把方法调用(method invocation)封装起来。没错,通过封装方法调用,我们可以把运算块包装成形。 所以调用此运算的对象不需要关心事情是如何进行的,只要知道如何使用包装成形的方法来完成它就可以。通过封装方法调用,也可以做一些很聪明的事情,例如记录日志,或者重复使用这些封装来实现撤销。让我们开始吧 现在有一个用户A,他们家有很多...原创 2019-05-13 13:54:24 · 110 阅读 · 0 评论 -
设计模式之单例模式(二)
上一篇我们对经典的单例模式进行了学习,并且知道了单例模式的概念,以及如何通过单线程去创建一个有效的单例模式,让程序不用多次去创建实例。 但是,通过巧克力工厂的实践,我们很想知道在多线程模式下,这个到底会是什么情况呢?所以,就有了我们继续学习的目标啦。原来单例模式,不简单呀。 多线程的麻烦 首先,我们还是看下巧克力工厂经典单例的代码:原本在单线程模式下,运行的还是挺好的,工厂里那些小...原创 2019-05-08 12:58:02 · 105 阅读 · 0 评论 -
设计模式之工厂模式(三)
上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看。这次,让我们通过设计模式的思想,来好好认识下工厂方法模式。 创建者和产品 所有工厂模式都用来封装对象的创建。工厂方法模式(Factory Method Pattern)通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。让我们来看看这些类图,以了解有哪些组成元素: 另一个观点...原创 2019-05-30 10:00:38 · 96 阅读 · 0 评论 -
设计模式之模板方法模式(三)
模板方法模式是一个很常见的模式,但是也需要我们拥有一双锐利的眼睛,因为模板方法有许多实现,而他们看起来并不一定和书上所讲的设计一致。 这个模式很常见是因为对创建框架来说,这个模式简直棒极了。由框架控制如何做事情,而由你(使用这个框架的人)指定框架算法中每个步骤的细节。 用模板方法排序 我们经常需要数组做什么事情?对了!排序。 Java数组类的设计者提供给我们一个方便的模板方法用来...原创 2019-06-03 18:05:48 · 106 阅读 · 0 评论 -
设计模式之模板方法模式(二)
上一篇我们已经学会了模板方法模式,这次我们继续来深入学习下。毕竟学会只是第一步,还有更进一步的学习和深入等着我们呢。 我们先来看下,对模板方法模式的一个总结的类图: 让我们细看抽象类是如何被定义的,包含了它内含的模板方法和原语操作。 abstractclassAbstractClass{//这就是模板方法。它被声明为final,以免子类改变这个算法的顺序fin...原创 2019-06-01 12:26:45 · 107 阅读 · 0 评论 -
设计模式之迭代器与组合模式(一)
很高兴,这本书总共13章,这次已经是到第9章了;同时也很遗憾,小编脱离了书本,还是不知道如何描述一个设计模式。就比如迭代器与组合模式,原书篇幅比较长,小编尽量通俗易懂些,不到之处,还请各位小伙伴参考原书,小编也欢迎和大家一起交流。 有许多种方法可以把对象堆起来成为一个集合(collection)。你可以把它们放进数组、堆栈、列表或是散列表中,这是你的自由。每一种都有它自己的优点和适合的...原创 2019-06-11 08:44:16 · 120 阅读 · 0 评论 -
设计模式之迭代器与组合模式(二)
在上次的文章中,我们通过层层引导,已经知道了迭代器模式的由来。现在我们再好好总结下。 关于迭代器模式,你所需要知道的第一件事情,就是它依赖于一个名为迭代器的接口。这是一个可能的迭代器的接口: 现在,我们一旦有了这个接口,就可以为各种对象集合实现迭代器:数组、列表、散列表…如果我么想要为数组实现迭代器,以便使用在DinerMenu中,看起来就像这样: 在餐厅菜单中加入一个迭代...原创 2019-06-18 13:50:20 · 109 阅读 · 0 评论 -
设计模式之迭代器与组合模式(三)
现在我们已经能愉快地看着一页一页罗列出来的菜单进行点菜了。现在又有的小伙伴希望能够加上一份餐后甜点的“子菜单”。怎么办呢?我们不仅仅要支持多个菜单,甚至还要支持菜单中的菜单。 如果我们能让甜点菜单变成餐厅菜单集合的一个元素,那该有多好。但是根据现在的实现,根本做不到呀。我们想要的是这样的: 我们需要什么 现在我们遇到的现实问题是,我们的系统已经达到了一个复杂的级别,如果现在不重新设计,就...原创 2019-06-22 12:03:09 · 101 阅读 · 0 评论 -
设计模式之迭代器与组合模式(四)
因为这系列篇幅较长,所以在这里也不进行任何铺垫,直奔主题去啦。 利用组合设计菜单 我们要如何在菜单上应用组合模式呢?一开始,我们需要创建一个组件接口来作为菜单和菜单项的共同接口,让我们能够用统一的做法来处理菜单和菜单项。换句话说,我们可以针对菜单或菜单项调用相同的方法。 让我们从头来看看如何让菜单能够符合组合模式的结构: 实现菜单组件 好了,我们开始编写菜单组件的抽象类;请...原创 2019-06-26 12:35:19 · 122 阅读 · 0 评论 -
设计模式之状态模式(一)
我原本以为在对乡村的一切事物都很容易,但是每次我一回头就有更多变更的请求纷至沓来。我快崩溃了!----当小编读到这段话的时候,甚是感慨,设计模式的世界真的不是那么容易弄懂的,好在我还在学习。 基本常识:策略模式和状态模式是双胞胎,在出生时才分开。策略模式是围绕可以互换的算法来创建成功业务的。然而,状态走的是更崇高的路,它通过改变对象内部的状态来帮助对象控制自己的行为。 我们先来看下对...原创 2019-07-23 14:31:26 · 130 阅读 · 0 评论 -
设计模式之状态模式(二)
在上一次的文章里,我们看到,需求的变更,迫使我们需要重新改造现有的糖果机代码来符合这个新提的需求。但是,也并没有难倒我们,至少我们在文末给出了思路和类图,不知道你想的怎么样了呢。 我们不来虚的,直接进入正题,开启我们的学习之旅。 实现我们的状态类 现在是实现一个状态的时候了:我们知道我们要的行为是什么,我们只需要把它变成代码。我们打算完全遵守所写下的状态机代码,但是这一次是分散在不同的类中。...原创 2019-07-30 12:10:10 · 276 阅读 · 0 评论 -
常用设计模式小结
现在你已经准备好迎接一个充满设计模式的崭新世界。 但是,在你打开所有的机会大门之前,我们需要告诉你一些即将在真实世界中遇到的细节–没错,外面的世界还是比较复杂的。来吧,接下来,我们会指引你的方向… 定义设计模式 在看完之前这么多章节的系列,相信作为读者的你已经基本了解什么是设计模式了。但我们至今还未给它一个正式的定义。我们先拿出一个常用的定义: 模式:是在某情境下,针对某问题的某种解决方案。 ...原创 2019-08-28 12:40:22 · 104 阅读 · 0 评论 -
设计模式遗珠(一)
通过之前一系列的学习,终于来到了我们的最后一章。剩余2个篇幅,我会把前面没有详细说明的模式,根据书本上的描述,做一个简要的说明。 这些设计模式不像之前那些那么经常地被使用。但是,他们也有相当的可取之处,如果你遇到了合适的情形,也应当毫无犹豫地采用它们。这里做了描述,就是想和大家一起通盘了解这些模式的意义。 剩余还有桥接、生成器(建造者)、责任链、享元、解释器、中介者、备忘录、原型和访问者模式。本次...原创 2019-09-22 20:53:07 · 214 阅读 · 0 评论 -
设计模式之命令模式(三)
我回来啦!今天是周六,一看命令模式还有一个总结未完成,赶紧爬起来做做好。 就如上一篇所说的,如果拥有了一个遥控器,却无法光凭按下一个按你,就同时能弄暗灯光、打开音响和电视、设置到DVD,并让热水器开始加温,那么我要这个遥控器还有什么意义呢? 使用宏命令 根据比较高级的想法来看,就是我们需要制造一种新的命令,用来执行其他一堆命令,而不只是执行一个命令,这样就是一个不错的想法了吧。这就...原创 2019-05-18 14:08:37 · 133 阅读 · 0 评论 -
设计模式之适配器与外观模式(一)
学习技术的过程总是需要慢慢积累的,所以持续学习是一个一直存在的事情。很高兴,我能一直通过看书输出设计模式相关的系列,也很感谢各位朋友的持续关注。 废话不多说啦,今天我们继续学习一个对于Android开发来说可能不太陌生的模式,适配器模式和外观模式。曾经或者现在正在做Android开发的你,是不是很熟悉这个呢?对的,Android里很多控件,可都是需要适配器来处理的噢,那我们赶紧进来看看...原创 2019-05-21 12:48:16 · 166 阅读 · 0 评论 -
设计模式之欢迎来到设计模式世界(二)
第一节的内容,不知道大家看的如何。小编在博客园的评论里,找到了第一篇的一个缺点,没有把动态改变行为的Duck子类列出来,导致有小伙伴有疑问。在这里说声抱歉,是我疏忽了,好在有GitHub,让大家可以进去一窥究竟,在后续的学习中我也会注意此类问题。 先来解答下上次课程留下的思考题,利用继承来提供Duck的行为,这会导致哪些缺点。有以下几个(看看你的答案是否和他吻合呢): √A 代码再多个子类中重...原创 2019-03-22 11:50:52 · 101 阅读 · 0 评论 -
设计模式之观察者模式(二)
上一篇的观察者模式学习的还好吗?首先简单来回顾下上篇内容,有一个气象站的需求,需要在温度、湿度、气压改变的时候,实时更新三个布告板,以便能及时、准确的获取信息。所以,在设计模式的层面,我们最容易想到并且最正确的方式就是使用观察者模式来处理这个问题。 上一篇,我们通过一系列的分析,并画出符合要求的类图,然后使用了第一种方式,通过自己动手写设计模式实现了观察者模式的功能。但是,截止到目前为止,我们观察...原创 2019-03-29 17:27:56 · 102 阅读 · 0 评论 -
设计模式之观察者模式(一)
前面两篇已经带大家走进了设计模式的世界,了解了策略模式,还有基本的OO基础和OO原则,不知道你是否能读懂以及了解呢。接下来,我们就要进入第二个模式的学习了,观察者模式,让我们来一窥究竟吧。 观察者模式是JDK中使用最多的模式之一,可以帮你的对象知悉情况,不会错过该对象感兴趣的事。对象甚至在运行时可决定是否要继续被通知。并且后续还会一并介绍一对多关系,以及松耦合。有了观察者,消息会变得更灵通。 还是...原创 2019-03-27 12:46:15 · 902 阅读 · 0 评论 -
设计模式之观察者模式(三)
又和大家见面了。首先,和大家说声抱歉,之前的几篇文章,可能条理清晰之类的做的不太好,每篇文章的篇幅也比较长,小编在收到读者的建议之后, 也是认真的思考了一番。之前的想法是尽量把一个模块介绍完,没想到一个模块写着写着就写长了。在之后的文章里,需要认真分段,做到能简洁就简洁,能分块就分块,在利用大家碎片化的时间里,力争短小精悍又能收获颇丰。 之前的观察者模式,介绍了自己动手编写一套观察者模式,以及使用...原创 2019-04-01 18:21:29 · 155 阅读 · 0 评论 -
设计模式之装饰者模式(二)
欢迎大家的不嫌弃,继续和我一起学习设计模式。上一篇已经把装饰者模式的类图有了一个整体的出来,末尾说的去想想实现的代码,你实践了吗?是什么原因让你实践了呢?又是什么原因让你没有动手呢?没动手,可能是思路还不够明确是吗? 接下来,我们继续学习。通过代码实现的方式,来搞定装饰者模式。 写下代码 动手的时候来啦,我们先从Beverage类下手。这不需要修改原有的设计,如下所示: /** * * @D...原创 2019-04-08 12:28:39 · 109 阅读 · 0 评论 -
设计模式之装饰者模式(一)
经过前两个模式的学习,是不是对设计模式有了进一步的认识了呢,现在,我们继续冲鸭。 本章可以称为“给爱用继承的人一个全新的设计眼界”。这里我们即将再度探讨典型的继承滥用问题,我们将学到如何使用对象组合的方式,做到在运行时装饰类。为什么呢?一旦熟悉了装饰的技巧,你将能够在不修改任何底层代码的情况下,给对象赋予新的职责。 之前我们见识了鸭子的各个表现会飞、会游泳、会叫、会跳;也看过了气象台实时更新的能力...原创 2019-04-03 10:16:39 · 151 阅读 · 0 评论 -
设计模式之工厂模式(一)
工厂模式的学习篇幅比较长,小编第一次看书的时候,就一口气花了一个多小时,还是通读。后面又断断续续地继续了解了下,力争做到清晰的认知,给大家一个简单的学习方式。所以,这次模块分的可能会比之前的多,涉及到多个工厂模式。好的,我们继续冲鸭!!! 除了使用new操作符之外,还有更多制造对象的方法。我们将了解到实例化这个活动不应该总是公开地进行,也会认识到初始化经常会造成“耦合”问题。所以,这肯定不是我们希...原创 2019-04-16 12:45:06 · 88 阅读 · 0 评论 -
设计模式之装饰者模式(三)
欢迎大家的持续关注。上一次,我们结合第一篇推导出来的类图,到第二篇根据类图进行实际代码的编写,对装饰者模式有了一个整体的概念以及实战。不知道对你帮助如何呢?小编已经有门道了,看完接下来的一部分,你会恍然大悟,原来实际编码中你一直在用装饰者模式。 真实世界的装饰者:Java I/O 看到标题,是不是就很想往下看,到底是I/O中的什么呢,让你早已经拥有了装饰者模式的实践?就如书上给的描述,你第一次(还...原创 2019-04-13 12:49:28 · 95 阅读 · 0 评论 -
设计模式之工厂模式(五)
前面几篇,我们已经把简单工厂、工厂方法模式以及抽象工厂模式一一进行了拆解,一步步让我们学会了这几个工厂模式,哦,对了,简单工厂并不算真正意义上的工厂。 我们通过吃披萨的启发,对创建披萨进行了改造;又发展了远景,对披萨加盟有了浓厚的兴趣,并开了很多加盟店;又对材料进行了严格把控,才有了现在的规模。工厂模式,就这样一层层地展现在我们面前。 首先,来看下上次遗留的抽象工厂模式的问题。抽象工厂允许客户使用...原创 2019-04-27 12:31:52 · 93 阅读 · 0 评论 -
设计模式之工厂模式(四)
上篇我们从理论上了解了什么是工厂方法模式,也知道了创建者类和产品类的主要作用是什么。更重要的是,我们还学到了一个设计原则依赖倒置原则,这个原则能推导出我们为什么会使用工厂模式。 当然啦,上次还留下几个指导方针帮助我们去遵循依赖倒置原则。所以,接下来,我们就利用这几个方针,跟着方法,来重新设计下我们的披萨店。 原料工厂 我们知道,每一家加盟店的产生都是要经过层层筛选的,尤其是这种食品店。要确保每家加...原创 2019-04-24 12:46:09 · 129 阅读 · 0 评论 -
设计模式之工厂模式(二)
之前已经带大家稍微入门了工厂模式(即简单工厂模式)的方法,没看过的朋友可以移步去查看一番。设计模式之工厂模式(一)。今天我们继续吃着披萨,学习着工厂模式的接下来部分吧。 加盟披萨店 我们先前的披萨店已经经营有成,击败了部分竞争者,接下来的计划就是开加盟店。作为经营者,你肯定希望确保加盟店运营的质量,所以希望这些店都是用你那些经过时间考验的代码。 但是每个地方可能需要不同口味的披萨(比如A地区、B地...原创 2019-04-20 12:15:00 · 138 阅读 · 0 评论 -
设计模式之单例模式(一)
这篇我们学习的是单例模式,相信很多朋友都或多或少使用过这个模式。很多设计模式的入门,都把单例模式作为第一个的,但是因为我们是跟着书本学习,所以放在了第五个里面。那么,你使用过的单例模式是怎么样的呢?懒汉式?饿汉式?双重校验?静态? 先来看下定义,单例模式(Singleton Pattern):用来创建独一无二的,只能有一个实例的对象的入场券。而且,单例模式的类图是所有设计模式中最简单的,事实上只有...原创 2019-05-06 13:48:49 · 101 阅读 · 0 评论 -
设计模式之模板方法模式(一)
学习了前面的朋友都知道,目前为止,我们的议题都是绕着封装转;我们已经封装了对象创建、方法调用、复杂接口、鸭子、比萨…那接下来呢? 我们将要深入封装算法块、好让子类可以在任何时候都可以将自己挂接进运算里。我们甚至会在这里学到一个受好莱坞影响而启发的设计原则。 喝点咖啡或茶饮 有些人喜欢喝咖啡,没有咖啡感觉生活索然无趣;有些人喜欢喝茶。那么,同样是茶饮,两者有没有什么共同或者是啥的?其...原创 2019-05-29 14:00:50 · 133 阅读 · 0 评论 -
设计模式之适配器模式与外观模式(二)
好了,通过上次的学习,我们已经知道适配器模式是如何将一个类的接口转换成另一个符合客户期望的接口。同时也知道在Java中要做到这一点,必须将一个不兼容接口的对象包装起来,变成兼容的对象。 我们现在要看一个改变接口的新模式,但是它改变接口的原因是为了简化接口。这个模式被巧妙地命名为外观模式(Facade-Pattern),之所以这么称呼,是因为它将一个或数个类的复杂的一切都隐藏在背后,只显...原创 2019-05-25 09:26:31 · 125 阅读 · 0 评论 -
设计模式遗珠(二)
终于终于,我们来到了设计模式学习的最后一篇,是整个干货系列的最后一篇了,还真有点舍不得,原来一个设计模式能学习这么久,也佩服自己的坚持。 期间有过学习写作课的时间,也有过偷懒的时间,好在都坚持下来了,好在我还在,你还在关注,我们一直都在努力,一直都在进步。 话不多说,先进入今天的主题,来聊聊最后的几个设计模式。 解释器模式 解释器模式:使用解释器模式(Interpreter Pattern)为语...原创 2019-09-22 20:53:46 · 152 阅读 · 0 评论