当前位置: 首页 > news >正文

第一章 理解设计模式

 

第一章 理解设计模式
1.1 模式的定义
什么是模式?
模式是被命名的有组织的信息,他捕获了在一定语境(场景)中包含相关作用力的问题的解决方案的本质结构和内在含义,这种解决方案被证明是成功的。
模式包括3个部分:相关的上下文与上下文相关的作用力系统解决问题的方案

*其实简单说也就是:模式的使用是在特定的环境下,处理特定问题的解决方案的通用思想。只有在环境和处理确定的情况下才可以选择正确的解决方案。

模式体现的就是平衡的思想。
模式的书写包括很多中,主要包括以下几个组成部分:
1.Name: 模式的名称反映描述的结构。但因长度有限不可能包含模式所描述的所有含义。
2.Problem:问题描述了模式的意图。(要解决的问题)
3.Context:即模式所适用的环境。
4.Forces:为了达到目标,各因素之间的相互作迎合制约,揭示了解决问题时需要考虑的各种代价。
5.Solution:解决方案给出问题的解决方法。
6.Example:实例。
7.Consenquence:在结果中需要描述应用魔术后系统的情况,其中既要描述模式的应用的效果,也要描述所付出的代价。
8.Relation Pattern:相关模式给出与这个模式相关的部分。
9.Known use:已知应用在现实中使用的实例。

 

1.2 GOF的设计模式与模式
GOF的实际模式与一般意义上的模式有很大区别。
GOF的设计模式与模式理论的区别是前者偏重于解决方案,而后者的描述更偏重于问题的描述。
在理解设计模式时,重点应该放在每个模式解决的场合和使用模式需要靠了的因素上。

 

1.3 理解模式的名称

1.4 理解模式的场景

1.5 理解模式中的作用力

1.6 理解模式的结果和代价
  1.61 对象过多
  1.62 更复杂的装配关系
  1.63 测试难度加大
  1.64 程序结构复杂

 

1.7 设计模式不能做什么
  1.71 设计模式不是法则

  模式理论的精髓之一就是模式的使用时有前提和代价的,模式是在某种前提下综合各方面因素后考虑得出的结果。
  1.72 不能提高开发速度或者形象开发速度
  在很多情况下关注的目标不是开发速度,而是程序的健壮性和可维护性。(不断的抽象、封装。对象、接口越来越多,结构越来越复杂。调试、测试越来越麻烦。当然快不了。)
  1.73 不是万能的
  设计模式的使用是自然而然的事情,很多情况下不使用模式是因为不需要,问题没有复杂到费用不可的程度。我们是为了设计而适用设计模式,而不是为了设计模式而设计。
  当你的项目发现如有下列问题之一时,就要考虑重构代码,可能会有某种模式适合。
  (1)代码无法进行单元测试。
  (2)需求的变动总是导致代码的变动。
  (3)有重复的代码存在。
  (4)继承层次过多。
  (5)隐藏的依赖过多。
  *以上的话让人深有同感。

 

1.8 设计模式的非软件示例
1.9 小结

 

=====

模式是从解决具体问题抽象出来的,这种具体问题在特定的上下文中重复出现。也就是说,每个具体形式都对一种重复的问题采用重复的解决方案。

 

 

转载于:https://www.cnblogs.com/KimSky/archive/2008/10/05/1304215.html

相关文章:

  • Gogs
  • [转]俞敏洪在北京大学2008年开学典礼上的演讲辞
  • 四种方法校验数组中是否包含某个指定的字符串
  • 水晶报表数据整形模型 兼答CSDN
  • 微信小程序 事件
  • PHPMYADMIN简明安装教程
  • Linux 系统中这样修复 SambaCry 漏洞
  • (转)Scala的“=”符号简介
  • POJ 1739 Tony's Tour, 连通性状态压缩DP
  • 具体解释Hibernate中的二级缓存
  • JavaScript学习系列(一)什么是javascript
  • 移动端唤起键盘时取消position:fixed定位
  • 磁盘爆满
  • 29、Java并发性和多线程-非阻塞算法
  • 吕佳(帮别人名字作诗)
  • [nginx文档翻译系列] 控制nginx
  • 《深入 React 技术栈》
  • Android Volley源码解析
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Linux后台研发超实用命令总结
  • mysql中InnoDB引擎中页的概念
  • 飞驰在Mesos的涡轮引擎上
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 基于 Babel 的 npm 包最小化设置
  • 计算机在识别图像时“看到”了什么?
  • 深入浏览器事件循环的本质
  • 使用putty远程连接linux
  • 手写双向链表LinkedList的几个常用功能
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 用Python写一份独特的元宵节祝福
  • - 转 Ext2.0 form使用实例
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​力扣解法汇总946-验证栈序列
  • ###C语言程序设计-----C语言学习(6)#
  • #define 用法
  • #大学#套接字
  • (1)(1.9) MSP (version 4.2)
  • (1)SpringCloud 整合Python
  • (1)虚拟机的安装与使用,linux系统安装
  • (11)MSP430F5529 定时器B
  • (6)设计一个TimeMap
  • (ibm)Java 语言的 XPath API
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (三)终结任务
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .Net6 Api Swagger配置
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • [].slice.call()将类数组转化为真正的数组
  • [ARM]ldr 和 adr 伪指令的区别
  • [c]统计数字
  • [C++]priority_queue的介绍及模拟实现