热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

从一个例子理解设计模式

看了不少设计模式的书,发现讲得都比较抽象。对于项目经验少的人很难理解,但是我觉得设计模式作为一种思想范畴的问题,不必要有这么高的门槛。只要有些生活阅历的人,都应该能够理解。这才能
看了不少设计模式的书,发现讲得都比较抽象。对于项目经验少的人很难理解,但是我觉得设计模式作为一种思想范畴的问题,不必要有这么高的门槛。只要有些生活阅历的人,都应该能够理解。这才能体现出其伟大。我以这个目标作为自己努力的方向,这里先写一点我由这个出发点所做的工作。
在讲模式之前,我先讲一下一个引例。
从前有个贫农,他有一块地。地不大,他自己就能种过来。这样省吃俭用过了几年,他攒了些钱。用这些钱他又买了块地,这时候他自己就有点种不过来了。但是为了能省钱,他还是没有请人,还是坚持着自己把这块地种完了。如此又过了几年,这时候这个贫农地又多了几块。成了中农了,这个时候他自己就干不过来活了,他要请几个长工干活,但是他自己也跟着干活。这个时候他要干两件事情了,不但要完成自己种地的事情,还要管理这些长工,让这些长工不要偷奸耍滑。如此几年,他的地更多了,雇佣的长工也更多了。这时候他发现自己连种地带干活有点忙不过来了。于是,他就尝试着自己不干活,只让雇佣的长工干。而他自己就管着这些长工就行了。这时候他的日子美了,每天喝着小酒没事看着这些长工让他们干活。而自己就等着收钱就行了。
但是,如此几年之后又有问题了。什么问题?因为他的地越来越多,雇佣的长工就越来越多。他发现自己管理这些长工也管不过来了,去了地的东头,地西头的偷懒。去地的西头呢,地东头的偷懒。他起初没什么办法,只能任由这些人偷懒。后来有个人找他,跟他喝了顿酒和他说。你给我点钱,我替你管他们。保证这些长工老老实实的干活,不敢偷懒。他因为酒喝的有点多,就同意了。这样就多了一个人替他管这些长工,开始的时候他有点后悔。心说自己的东西,这个人没干什么活就得钱了,这不是弱智吗。但是,后来他慢慢发现这样一个人存在。他自己省事多了,有什么事不用自己亲自干了。只要把这个人叫来去做就行了,而且到年终的时候一算账收入竟然还略有增长。这样这个新升的地主就把这个制度延续了下去。而随着他的钱越来越多,拥有的地越来越大,雇佣的人也就越来越多。这些人里面管理那些干活的人也就多了起来,慢慢的这些管理的人也分了层次。有总管,管家,仆人。而他自己作为一个大地主,要干什么事情只要和底下的总管说一声,自然就有人替他干了。他再也不用什么事情都亲历亲为了。故事讲到这里就结束了,里面包含了很多的道理。设计模式能够存在的原因就在其中,那究竟是什么原因呢。听我细细说来。
作为一个程序员,起初的时候我们都跟故事中的贫农一样地不多。我们能做的都是写小项目,这些小项目我们写一个类就能够实现。随着项目的扩大,我们在这个类中不断的增加内容。当项目到达一定的程度之后,我们会发现在这一个类写代码有点太累了。如同故事中的贫农他自己一个人干不过来那么多活。这个时候我们就想到要创建几个新的类,也就是雇佣几个长工。这几个新的类来做具体的事情,而只要有一个类来管理这几个具体干活的类就行了。这样我们把整个项目结构分成了两层,一层干活一层管理。把这个架构搭好之后,我们只要向管理的类发个命令,就好了。这样我们可以干点更大的项目了,但这个时候我们会发现一个管理类管理太多的具体干活的类有点力不从心。如同故事中的主人公管不了太多的长工。这个时候,你就要写多点的管理类,原来一个类的活两个类干或者更多的类来干。这样慢慢的,我们整个项目架构中类的层次就越来越多。但是,这却并没有增加我们干活的复杂度。因为有事的时候,我们只要调用最顶层的那个管理类就能够实现很多的功能。这如同现实中的领导说一句话,那会牵扯到很多的人。普通人说修条路,可能一辈子都完不了,而主席说盖栋楼则一夜之间就能盖起高楼大厦。
这样我们,把一个项目中的类分成了两种,一种是具体干活的,一种是管理干活的。而管理的之中又分很多的层次,这个时候就可能会出现混乱。所以就要设计好一些方法,这些方法能够让这个由干活的类和管理的类都各司其职,干好本质工作。使整个项目能够正确快速的运转。于是慢慢的有一些特别好的方法出现了,这些经过淘汰下来的好的方法,我们给它们起了个名字叫模式。于是就出现了设计模式。
理解了上面的这些东西,你就会发现设计模式是个什么东西。它可能是我们在贫农阶段所不了解的,但是随着你项目的不断扩大,你会慢慢意识到它的价值所在。没有这些模式的存在,我们很难一个大型的项目成型,并且正确的运转。
下面说下初学模式可能会遇到的一些问题,首先要知道我们现在如果当个地主,那么很容易就知道要雇人干活,雇人管理这些人。而你只要坐着数数钱就行,但是这时候,我们要知道感谢那个创建了地主制度的人。否则你即使有再多的地,也是没用的。而这个制度的创造者一定是个设计模式方面的高手。所以,要使用到模式的时候很多时候都是要项目规模到了一定程度之后才会体现出它的价值。否则只是一个加减法的运算,那还用什么模式。
第二点,当一个模式创建出来之后,我们在干类似的事情之后会节省很多的力气。就如同我们现在当个地主,那很多管理上的事情我们都不用自己想了,早有人替我们想好了。所以学习模式是有意义的,因为它们是经过筛选后所存在下来的。能够重复的被使用,所以学过之后我们再面对类似的问题的时候就会很快的理解。学一门新的技术,也就不会再显得太难。
就讲到这里,我这里主要说了一些我认为在初学设计模式要知道的东西。而这些东西,在书上一般是没有的。

推荐阅读
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文详细介绍 GBase ADO.NET 中 FillSchema 方法的多个重载函数,该方法用于填充 DataSet 或 DataTable 的架构,并根据指定的 SchemaType 配置架构。通过这些重载函数,开发人员可以灵活地控制数据架构的生成方式。 ... [详细]
  • Valve 发布 Steam Deck 的新版 Windows 驱动程序
    Valve 最新发布了针对 Steam Deck 掌机的 Windows 驱动程序,旨在提升其在 Windows 环境下的兼容性、安全性和性能表现。 ... [详细]
  • 探讨如何通过编程技术实现100个并发连接,解决线程创建顺序问题,并提供高效的并发测试方案。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 深入解析 HDFS Federation:多命名空间架构详解
    HDFS Federation 是一种扩展 HDFS 架构的方式,通过引入多个独立的 NameNode 来解决单点故障和性能瓶颈问题。本文将详细探讨 HDFS Federation 的工作原理、优势以及潜在挑战。 ... [详细]
  • IT项目管理过程中的方法、工具、技术
    工欲善其事,必先利其器。而对于一个软件开发项目,最重要的器就是方法,工具和技术。而这三要素中重要的又是方法论,方法是基础&# ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨了一家企业的制度体系重构与升级过程,通过具体案例展示了如何在战略意图和管理理念指导下,系统性地提升企业管理制度的有效性和可操作性。 ... [详细]
  • 如何优化2060显卡设置以提升《Apex英雄》游戏体验
    《Apex英雄》作为一款热门的战术竞技游戏,吸引了大量玩家。本文将探讨如何通过优化GeForce RTX 2060显卡设置,确保在《Apex英雄》中获得最佳性能和流畅的游戏体验。 ... [详细]
  • 本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ... [详细]
  • 如何在PostgreSQL中查看数据表
    本文将指导您使用pgAdmin工具连接到PostgreSQL数据库,并展示如何浏览和查找其中的数据表。通过简单的步骤,您可以轻松访问所需的表结构和数据。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
author-avatar
挥霍无罪1988
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有