关于模式,相信大家均有自己的感性认识。所谓模式无非是特定场景用特定方法,且该场景可重现。正如现实世界中我们读书学习、相互交流、出国考察等,均是为了找寻模式丰富大脑的知识以待后用。不过,我们人类的活动并不仅仅局限在已有的模式中,因为我们更期待用好、用精模式,并且有创造模式的能力。
当然,关于模式自然有官方较为精确的定义,比如建筑领域大师Christopher Alexande说:“每一个模式描述了一个在我们周围不断重复发生的问题,以及给问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必重复劳动。”Alexander所指的这种城市和建筑模式的思想也同样适用于软件领域的设计模式,90年代前期便有很多人从事软件设计模式的工作,由GOF 整理的23中设计模式至今影响深远。
一般而言,一个设计模式有四个基本要素:模式名称、问题、解决方案和效果。其中,模式名称为助记名,能用简短的词语描述模式的问题、解决方案和效果;问题描述了应该在何时使用模式;解决方案是对问题的处理,描述了设计的组成成分,它们之间的相互关系以及各自的职责和相互关系;效果描述了模式应用的效果及使用模式应权衡的问题。
那么,我们将如何快速学习好并掌握好模式呢?
简而言之,理解模式的核心在于重用&开-闭。关于重用,从重用的粒度上看,可归类为代码级、方法级、模板级、模块级以及框架级,它的发展路线上抽象层次越来越高&重用粒度越来越大(设计模式主要是思想上的重用,涉及到上面提及重用粒度中的一种或多种),重用的目的就是为了降低代码冗余(避免开发中存在ctr+c&ctrl+v借用代码的坏味道);关于开-闭,主要是指对系统功能扩充开发&对代码修改关闭,它的目的在于追求功能的扩充尽量不影响原有系统。
接下来的问题是怎样保证重用原则和开-闭原则?
一般而言,重用原则主要是通过良性设计、代码上移&数据下移的思想来保证,而开-闭原则是通过依赖倒转、接口隔离、迪米特原则、里氏替换原则、组合/聚集等思想来保证。
由此可见,我们理解模式的核心在于思考以下几点:
1、模式所属类别;
2、模式四要素:模式名、场景、解决之道、效果;
3、重用原则(代码上移&数据下移);
4、开-闭原则(依赖倒转、接口隔离、迪米特原则、里氏替换原则、组合/聚集)。
这里重点阐述下重用原则的代码上移&数据下移。对于代码上移&数据下移来达到重用的目的这一观点相信大家都可以理解,但这里隐藏了一个问题,那就是实现。java中的这种实现无非借助于(抽象)类和接口,为了达到代码上移&数据下移的目的,我们不得不需要将焦点转移到java抽象类与接口的异同探讨上来。
首先,什么是Java接口?它有哪些特性?它的价值是什么?
JAVA接口:一些方法特征的集合。JAVA接口--在Java语言中存在的结构,有特定的语法和结构;而一般接口--仅仅指一个类所具有的方法的特征集合,是一种逻辑上的抽象;
JAVA接口特性:1、方法默认public;2、属性默认public static final;3、仅是方法签名,无实现;4、一些看上去毫不相干的类,可以因为提供相类似的服务,从而具有相同的接口;(常见的接口有:单方法接口、标识接口、常量接口)
JAVA接口价值:若没有Java接口,便无法做到对可查入性的保证(继承,不支持多继承,无法彻底保证可插入性){面向接口编程}
其次,什么是抽象类?它有哪些特性?
抽象类:代表一个抽象的概念,代表一个类型的实现;
抽象类特性:1、可以有实例变量,1或n个构造子;2、可以同时有抽象方法和具体方法;3、不可以自我实例化;
再次,java接口与抽象类间有何关系?
1、多继承--接口允许多继承,类不允许;2、商业方法--接口仅为特征签名,而类允许存在实现;
最后,对于开发,现代观点是面向接口(抽象)编程,组合优于继承,那么,我们要怎么做呢?其实很简单,这条仅是经验推荐原则(最佳实践),就是多学习、多积累。
比如下面采用接口与抽象混用的方式解决多继承与代码上移:
这样设计的特点是通过抽象层(水果、蔬菜)对接口的实现,达到代码上移&数据下移目的的同时,实现了蔬菜类西红柿变身水果类的多继承。
工作久了,时间紧了,人也懒了,懒得将大脑中汇总的知识形成于文,然随着时间的流逝,有些渐被淡忘,事后想来,多少是种损失,有点遗憾。为了有所弥补,便打算做个备忘于此。
以上是对模式的一些简单阐述,为的就是Pattern栏目做个铺垫,在未来的将着重讲述下GOF 23模式的自我理解,做个简单备份吧
分享到:
相关推荐
《关于模式识别研究热点的综述——聚焦数字水印技术》 模式识别是人工智能领域中的一个重要分支,旨在通过分析和处理各类信息,实现对事物或现象的描述、辨识、分类和解释。这一领域的研究涵盖了有监督和无监督的...
模式识别是一种重要的信息技术,它涉及计算机视觉、人工智能、机器学习等多个领域,被广泛应用于图像处理、语音识别、生物特征识别等诸多场景。这份“模式识别培训讲义”将为我们提供一个全面而深入的理解。 讲义...
这为读者提供了一个全面的关于模式概念及其应用的基础知识。模式在这里不仅被看作是解决特定问题的方案,还是一种交流架构愿景的工具。 第二部分则着重于模式之间的关系。作者通过研究模式间的相互作用,展示了如何...
在Python编程语言中,模式识别是一种重要的数据处理和分析技术,尤其在机器学习、人工智能以及数据分析等领域广泛应用。模式识别通常涉及到从数据集中提取特征,构建模型,并用这些模型来识别新的未知数据。在这个...
关于模式识别的方法,分为统计模式识别和句法模式识别两大类。统计模式识别依赖于从样本中提取的特征的统计特性来识别模式。例如,在对性别进行识别的体检例子中,通过已知性别的训练样本,建立判别函数,并使用该...
实验四则是关于模式的综合运用,学生们可能被要求将前面学习的多种模式结合在一起,解决更复杂的问题。这展示了设计模式并非孤立使用,而是可以相互配合,提升软件架构的整体质量。 在提交的文档“笃行园427五子棋...
这些模式的特性曲线提供了关于模式的截止频率、基模以及光纤单模工作条件的重要信息。 ### 弱导光纤的标量近似理论与线偏振模 在弱导光纤中,由于芯部和包层的折射率差异较小,可以采用标量近似理论简化问题。在...
以下是关于模式识别的一些关键知识点: 1. **定义与背景**:模式识别是通过分析数据或输入,从中找出规律和模式,然后对未知数据进行分类或预测的过程。它起源于20世纪50年代,随着计算机科学的发展而逐渐成熟,...
根据提供的信息,我们可以推断出这是一本关于模式识别与模式分类的经典教材。虽然实际的内容并未给出,但基于书名及描述,我们可以围绕模式识别这一主题进行深入探讨,并结合模式分类的基本概念、方法以及应用场景等...
"Duda"可能是提到的一本关于模式识别的经典教材,通常这类教材会包含大量的课后习题来帮助学生深入理解理论知识并提升实践能力。在这个压缩包中,可能包含了该书的部分习题解答,特别是第二章到第五章的内容。 首先...
本压缩包文件"moshishibie.rar"包含了名为"Duda ppt_模式识别_模式识别 ppt_模式识别ppt"的相关内容,显然这是一个关于模式识别的PPT课件,可能是教学或自学的资源,尤其适合正在学习模式识别的学生。 Duda的《模式...
这个压缩包文件名为"模式识别",表明其中包含了关于模式识别的各种资料,可能包括理论讲解、算法实现、实例应用等内容,对于学习和应用模式识别技术的人来说极具价值。 模式识别的核心目标是让计算机能够自动识别和...
7. **Matlab编程技巧**:这不仅是关于模式识别,也是关于如何高效地使用Matlab进行科学计算。可能涉及矩阵操作、循环结构、函数定义、脚本和函数调用等。 8. **结果可视化**:Matlab的强大在于其出色的可视化功能。...
在本压缩包文件中,包含了多个关于模式识别的PPT讲义,这些讲义覆盖了模式识别的基础理论和关键概念,为深入学习提供了丰富的资源。 首先,我们从第二章“判别函数0307.ppt”开始,这部分内容可能涵盖了判别模型的...
1.3 关于模式识别的一些基本问题 模式识别面临的主要挑战包括数据的复杂性、噪声、维度灾难以及过拟合等。解决这些问题需要合适的特征选择、有效的学习算法和合理的评估标准。 1.4 关于本书的内容安排 本书可能涵盖...
在本题目中,我们看到的是一个关于模式识别课程第五章作业的相关解答,涉及到的主要知识点是特征值分解和主成分分析(PCA)。 特征值分解是一种线性代数方法,用于分析矩阵的特性。在这个问题中,首先要求解矩阵R的...
以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...
#### 关于模式 设计模式是一种在特定情境下解决问题的通用方案。它们提供了经过验证的解决方案,可以帮助开发人员构建出灵活、可扩展且易于维护的应用程序。设计模式通常由三个主要部分组成:问题定义、解决方案...
总的来说,这份压缩包为学习者提供了一本关于模式识别的电子书,并结合MATLAB这一强大的工具,为理论学习与实践操作提供了支持。无论是对模式识别感兴趣的初学者还是在进行相关项目研究的专业人士,都能从中受益。