模式总论-总诀式

2024-03-28 00:32
文章标签 模式 总论 总诀

本文主要是介绍模式总论-总诀式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在探讨模式的概念之前我们来看一个例子,独孤九剑共有九剑,独孤求败将不同兵器分门别类来研究破解之道,破剑式用来专门对付所有使剑的高手,破掌式专门对付使掌的高手,而破箭式专门对付各类暗器,当年令狐冲就是用破箭式救了他心爱的小师妹,以及整个华山派。这里的九剑就是九种模式,它们是独孤求败创建的,传给了风清扬,再传给令狐冲,说明模式是一种可传承、重用的一种经验。各种模式具有各自的价值,各自的出发点或动机也不一样,换句话说,不同的模式代表了不同的价值衡量标准,如破剑式的价值准则就是打败所有剑术高手。我们应用时就是靠这种价值准则来识别和选择模式的。
    认识模式并不难,但要给它下一个定义却很难,因为每个领域对它的理解不同,所以它是一种很高级的抽象,正如老子的那句话-道可道,非常道,名可名,非常名。模式也是如此,所以我们只要理解了模式的几个要素,模式的本质和价值观就可以了。
    模式有三大要素:问题,环境,解决方案。
    问题当然就是你要解决的问题,注意这里指的是一类问题,从一个具体问题中抽象出来的,如果只是一个问题,只发生一次,就无所谓模式了。就破剑式而言,对付所有的剑法是一类问题,而不仅仅是对付某一种剑法。
    环境指的是问题发生的环境,就是说面对一个有武功的人,他是使剑的还是使掌的得分辨出来,还有就是这人内力的是否高深,就是一个人的武功环境,了解了这个才能作出决策-用哪一剑对付他。
    解决方案自然就是解决问题的一种方法。也就是用破剑式来对付剑术高手。
 
    模式存在的基础:
    模式的存在的目的是因为它要被重用,如果遗失了这个本质,模式就会成为一种束之高阁的理论,模式是依存于具体实践的,是对具体领域具体问题解决方案的一种抽象。所以模式不是抽象的理论,而是可重用经验的总结,抽象。
    模式具有时效性,举个例子,我们都有过远行(旅行,出差,探亲)的经历,比如我们从北京到上海,你打算怎么走,有几种可选的模式:走路,坐马车,乘火车,乘飞机等。走路或坐马车也是一种模式,但那是一种废弃的模式,因为在古代我们没有发达的交通工具,只能如此,而现在科技发展了,它就不再适用了,这也正好验证了马克思的“真理是相对的,不是永恒的,任何存在的事物都会灭亡。”
    模式具有有限范围的适用性,认识这一点很重要,比如独孤九剑,有破剑式和破掌式,破剑式是针对剑类兵器的,而破掌式是针对类似金刚掌,如来掌等掌法类的。如果令狐冲拿着破掌式去对付东方不败,那早就死定了。再举个开发中的例子,GOF的设计模式中有一个Factory模式,它的好处主要是封装了一族类的实现(比如一种商品,他们有不同的型号,不同的价格,但他们的功能性一致,价格也是遵循某种算法的),由factory决定你要创建的类,你可以在运行时动态地从文件里读取你要实例化的类的ID(比如这种商品的某种型号),然后用factory来实例化它,这种运行时的动态特性让你不必把代码写死-hardcode。而且对使用API的用户隐藏了具体实现细节的同时又获得了可扩展性,今后当你要添加新的型号的该种商品时你只需添加新的类而不需更改现有的任何类。听起来不错,但获取这种优点是有代价的,会引入复杂性,而且问题是你不是任何时候都需要这么有类似行为的一族类,如果你只有那么一个类就可以了,你当然没必要把事情搞得那么复杂。很显然这种需求是在factory模式的适用范围之外的。
            模式具有原子可操作性,为什么这么说,因为一个设计结构组合应用好几个模式,就是说各模式之间没有任何耦合也不存在排斥,他们可以共同分担责任来构造一个架构。比如GOF的设计模式中有一个Flyweight模式,它本身就是有Factory模式和Composite模式组合而成的。还有一个例子就是,我们用Command模式时就经常用Factory模式来产生Command的实例。这种例子还有很多,因此我们说模式是具有原子性的。
            模式是可以变异的,模式重要的是它的思想,而不是它的外在表现形式,所以一种模式可能会有很多种变体,我们在实践中用到的模式可能和教科书上的长的不一样,但只要它的思想是一致的,在概念上是一致的,那么你用的模式就是这种模式。比如说GOF的设计模式中有一个Singleton模式,我们都知道这个模式是用来保证一个类只会产生一个实例,但是你有可能遇到某个应用是需要只产生有限个(比如5个)实例,怎么办,很简单,你把有限个实例储存在一个HashMap里,今后只能有这几个实例就可以了。这显然还是Singleton的思想,在限制实例个数的概念性上和Singleton是一致的。
模式选择的价值观:
我们永远选择最适合我们需要的模式。选择用什么模式是要具体情况具体分析的,需求不同、技术环境不同会直接影响到模式的选择。在这个领域里,没有一成不变的规则。
下面举个例子来说明,我们要描述一个CD的特性,如果我们是在开发一个CD播放器的话,我们只在乎这种CD是VCD还是DVD格式,因为我们根据格式来播放,我们不管CD是什么内容。这时我们可以用一个Strategy模式来描述CD,我们可以定义出VCDStrategy和DVDStrategy两个策略类来区分不同格式的CD,因为他们只是解码算法不同,但播放行为应该是一致的,所以我们通过剥离算法来获得行为的一致性。而当我们要开发一个CD管理软件时,我们需要根据他的内容来分类,比如动作片、卡通片、情感片等,而其中动作片中,又按语言分成内地片、港台片、英文片三类,然后英文片又分成美国片、印度片等等,很显然我们关注它的层次结构,这当然是应用Composite模式的最好时机,我们把所有CD存储在一个Composite的层次结构中,今后可以很方便的查找、管理。
我们从这个例子可以看到,不同的应用需求我们采用了不同的模式。这说明了模式选择的价值准则就是,我选择的模式最适合解决我所关注的问题。关注的点不一样,选择就可能不一样。
另外我们也可以看到,模式没有绝对的优劣之分,每一种模式都只是在某类需求上体现它的价值。往往当你获得一种价值和优点的同时可能就意味着失去另一种价值和优点。比如你选择了Singleton模式,可以获得单一实例的优点,却失去了可继承的OO特性。又比如你采用MVC(Model-View-Control)架构模式时,将领域逻辑和界面可以很好的分离,但获得这种好处是以复杂性为代价的,会引入很多与你的领域逻辑无关的类。这也就是说每一种模式都只满足了一类价值准则。
 

这篇关于模式总论-总诀式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853896

相关文章

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架