小陈浅析设计模式的冰山一角(一)

本文深入浅出地介绍了设计模式的概念,由Erich Gamma等四位大师级人物提出的23种经典设计模式,及其在软件开发中的应用。文章通过实例讲解了UML图和时序图的绘制方法,以及简单工厂模式的实现过程。

一、什么是设计模式?怎么来的,有什么类型,如何学?

定义

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中 面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的

讲人话

设计模式就是:设计模式是一套被 反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。

怎么来的,那个大佬设计的

说到这个不得不提大名鼎鼎的”四人帮“。
在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。
四位作者合称 GOF(四人帮,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则。

  • 对接口编程而不是对实现编程。
  • 优先使用对象组合而不是继承。
有什么种类

且看下面我画的脑图:
在这里插入图片描述
这些模式我们都应该了解并掌握其思想。站在巨人的肩膀上,看看别人是怎么思考的。哈哈哈,扯远了,回归正题

如何学

这个我也不懂,如果你是一个小白,那就多多实践,和我一样多敲而已(我也是菜鸡)。 讲之前,先入门一下UML图和时序图

二、UML图和时序图

先从一个实例开始,如下图所示:
在这里插入图片描述

  • 虚线空箭头:表示继承实现关系,如上图中的台式电脑和手提电脑依赖继承自抽象类computer。
  • 虚线带箭头:表示依赖关系,如图中的学生依赖于手提电脑。
  • 实线空心箭头:表示继承泛化关系。
  • 实线: 表示关联关系,如图中的学生和学生证,学生证可以证明学生的身份,学生为学生证的所有者。
  • 实线空菱形箭头:表示聚合关系,如图中的学生属于学校的一份子。
  • 实线实菱形箭头:表示组合关系,如图中的内存条,固态等都是电脑的组成部分。
类之间的关系
一般类图

在这里插入图片描述

1.实现关系(realize)

在这里插入图片描述
继承关系为is-a,两个对象如果用is-a表示,就表示继承关系。继承是对象之间耦合度最高的一种关系,子类继承父类的所有细节,除了父类的私有属性和方法。

2.泛化关系(generalization)

泛化关系为某一类的具体实现。
在这里插入图片描述

3.聚合关系(aggregation)

在这里插入图片描述
表示has-a的关系,是一种不稳定的包含关系,个体存在于总体当中但不依赖总体,就好比学生与学校,学校不办了,学生可以转学到另一个学校,不会因为学校的不存在而导致学生个体的消亡。

4.组合关系(Composition)

在这里插入图片描述
也是has-a的关系,但是却是一种稳定的包含关系,总体的消亡,个体也不复存在。理解为一种强依赖的特殊聚合关系。

5. 依赖关系(dependency)

依赖关系是用一套带箭头的虚线表示的,如下图表示学生办公依赖于手提电脑,他描述的是运行期间会用到另一个对象的关系。
在这里插入图片描述

三、简单工厂实例

适合应用场景:
  • 工厂类负责的创建比较少:工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂 。

  • 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

简单工厂模式所包含的角色和UML用例:

简单工厂模式包含三个角色工厂角色负责实现创建所有实例的内部逻辑;抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口;具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
UML用例:
在这里插入图片描述

四、直接撸代码:

<?php
/**
 * 来个开胃菜,简单工厂的模式
 */
//具体产品cat
class Cat
{
	
	function __construct()
	{
		# code...
		echo "I am a <span style='color:red'>cat</span> class".'<br>';
	}
}
//具体产品dog
class Dog
{
	function __construct()
	{
		echo "I am a dog class".'<br>';
	}
}
//简单工厂类
class Factory
{
	public static function CreateAnimal($name=null)
	{
		if ($name == 'Cat') {
			# code...
			return new Cat();
			
		} elseif ($name == 'Dog') {
			# code...
			return new Dog();
		} else {
		return '没传入参数,';
	 }
	}
}
$cat =  Factory::CreateAnimal('Cat');
$cat =  Factory::CreateAnimal('Dog');

最后输出结果:
在这里插入图片描述
好了,简单的工厂模式,到此就结束了,未完待续……欢迎各位大神留言交流。

本课题设计了种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值