为什么要引入模式概念来设计软件
今天读了《设计模式精解》中的设计模式篇,感觉现在才算是对模式有了一定了解。
在此将一些心得体会和大家交流一下:)
要了解模式首先就要知道什么是模式
关于什么是模式,官方一点的概念就是:解决相似问题的不同解决方案(或 在某一情景下的问题解决方案)
也就是说,要解决一个问题,方法不只一种,可以有很多种,就像1+1+1=3,1+2=3,2+1=3,0+3=3,3+0=3。
这里的问题就是要得出数字3,怎样才能得出数字3 (这个就是要解决的问题)
有这些方法可以得到:1+1+1,1+2,2+1,0+3,3+0 (这些就是解决问题的方法)
直于要用什么要的方法来解决这个问题,这就要看是什么情景了,
如果是每个相加的数不能大于1,那么就用1+1+1;
如果最多只能出现2个加数,那么就可以用1+2,2+1,0+3,3+0;
如果每个相加的数必须大于0,那么就可以用1+1+1,1+2,2+1;
这些就是在某一情景下的问题解决方案的最简单的描述,至少,我是这么理解的。
再来看下模式的基本要素
项目 描述
名称 每个模式都有一个独一无二的名称,以便人们鉴别
意图 模式的目的
问题 模式试图解决的问题
解决方案 对于自己出现的场景中的问题,模式怎样提供一个解决方案
参与者和协作者 模式包括的实体
效果 使用模式的效果。使用模式的同时研究其约束
实现 怎样实现模式(实现只是模式的具体表现形式,而不能像模式本身那样被分析)
还有学习设计模式的目的
·复用解决方案(别人总结的经验,我们可以直接拿来用)
一个好的解决方案,我们肯定不会只用一次就将其丢弃了,这和一个好的算法一样,有了我们就可以拿来用,这样就可以提高我们的开发效率,不必去做一些重复的工作。
·建立通用的术语(有利于交流和协作,这也应该可以看成一种标准)
我是这样理解“通用”和“标准”的:
先看一个有趣的东东:
“我爱你”的各种国家语言
Afrikaans(南非洲的荷兰语) - Ek het jou lief
Albanian(阿尔巴尼亚) - Te dua
Arabic(阿拉伯(对男性) - Ana behibak (to male)
Arabic(阿拉伯(对女性) - Ana behibek (to female)
Armenian(亚美尼亚) - Yes kez sirumen
Bambara(班拉族语) - M'bi fe
Bangla(孟加拉语) - Aamee tuma ke bhalo aashi
Bulgarian(保加利亚) - Obicham te
Cambodian(柬埔寨) - Soro lahn nhee ah
Cantonese Chinese(广东话) - Ngo oiy ney a
Catalan(加泰罗尼亚语) - T'estimo
Cheyenne(夏安语) - Ne mohotatse
Chichewa(齐佩瓦语) - Ndimakukonda
Chinese(汉语) - 我爱你 (wo ai ni)
Corsican(科西嘉语) - Ti tengu caru (to male)
Creol(克利奥尔语) - Mi aime jou
Croatian(克罗地亚语) - Volim te
Czech(捷克) - Miluji te
Danish(丹麦) - Jeg Elsker Dig
Dutch(荷兰) - Ik hou van jou
English(英语) - I love you
Esperanto(世界语) - Mi amas vin
Estonian(爱沙尼亚) - Ma armastan sind
Ethiopian(埃塞俄比亚) - Afgreki'
Faroese(法罗语) - Eg elski teg
Farsi(波斯语) - Doset daram
Filipino(菲律宾) - Mahal kita
Finnish(芬兰) - Mina rakastan sinua
French(法语) - Je t'aime
Gaelic(盖尔语) - Ta gra agam ort
Georgian(乔治亚州) - Mikvarhar
German(德语) - Ich liebe dich
Greek(希腊) - S'agapo
Hawaiian(夏威夷语) - Aloha wau ia oi
Hebrew(希伯来语(对女性) - Ani ohev otah (to female)
Hebrew(希伯来语(对男性) - Ani ohev et otha (to male)
Hindi(北印度语) - Hum Tumhe Pyar Karte hae
Hopi(霍皮语) - Nu' umi unangwa'ta
Hungarian(匈牙利) - Szeretlek
Icelandic(冰岛) - Eg elska tig
Indonesian(印度尼西亚) - Saya cinta padamu
Inuit(纽因特语) - Negligevapse
Irish(爱尔兰) - Taim i' ngra leat
Italian(意大利) - Ti amo
Japanese(日本) -爱してる (Aishiteru)
Kannada(埃那得语) - Naanu ninna preetisuttene
Kiswahili(斯瓦西里语) - Nakupenda
Korean(韩语) - 사랑해 (Sarang Heyo)
Latin(拉丁语) - Te amo
Latvian(拉托维亚语) - Es tevi miilu
Lebanese(黎巴嫩) - Bahibak
Lithuanian(立陶宛) - Tave myliu
Malay(马来语) - Saya cintakan mu / Aku cinta padamu
Malayalam(马拉雅拉姆语) - Njan Ninne Premikunnu
Marathi(马拉地语) - Me tula prem karto
Mohawk(莫霍克语) - Kanbhik
Moroccan(摩洛哥) - Ana moajaba bik
Nahuatl(纳瓦特尔语) - Ni mits neki
Navaho(纳瓦霍语) - Ayor anosh'ni
Norwegian(挪威) - Jeg Elsker Deg
Papiamento(帕皮阿门托语) - Mi ta stimabo
Persian(波斯语) - Doo-set daaram
Pig Latin(大拉丁语) - Iay ovlay ouyay
Polish(波兰) - Kocham Ciebie
Portuguese(葡萄牙) - Eu te amo
Thai(泰语(对男性) - Chan rak khun (to male)
Thai(泰语(对女性) - Phom rak khun (to female)
Turkish(土尔其) - Seni Seviyorum
Ukrainian(乌克兰) - Ya tebe kahayu
Urdu(乌尔都语) - mai aap say pyaar karta hoo
Vietnamese(越南(对女性) - Anh ye^u em (to female)
Vietnamese(越南(对男性) - Em ye^u anh (to male)
Welsh(威尔士语) - 'Rwy'n dy garu
Yiddish(意第绪语) - Ikh hob dikh
这个东东想必大家都看到过,为了表达同一个意思,却有这么多种语言,在语言学中,足可以表现出其的丰富多彩。但如果要对各个国家的人表达这么一个意思,就要用到这么多个字符来分别表示~~~天~~
如果,也仅仅是如果哈,ISO哪天发布了《“我爱你”全球化标准权威指南》,那么要对全球人们表达这个意思就轻松多了。。。这里就足以可见标准的重要性了。
所以,我所理解的标准就是,实现各种相同概念的不同表达方式的统一。
概念的表达方式一旦得到统一,那么人们交流起来自然就轻松多了。
·可以从更高层的视角来观察问题、设计过程和面向对象(避免过早接触细节)
为了说明为什么要避免过早地接触细节,书中引入了经典的“木匠模式”
(这个可以最最简单地反应出模式的实质)
两个木匠关于制作抽屉的对话原文:
“木匠A:你认为我们应该怎样制作这些抽屉呢?
木匠B:唔,你想我们应该这样做结合部分,在木材上直锯下去,然后回转45°锯,然后再直锯下去,再朝另一个方向回转45°锯,再直锯下去,然后……”有点晕,不知道木匠B在说什么。
这就相当于
“程序员A:你认为我们应该怎样完成这个程序呢?
程序员B:唔,你想我们应该这样做,先用if语句判断该数字是不是在指定范围之内,如果符合要求,就定义一个变量i,用一个for循环,i的范围从1到之前判断的数本身,每次递增1,用判断后的数来除以i,每次用if语句来判断它能否被i整除,如果……”
就是这样,B的回答就是代码细节,说明了要用什么样的代码来处理,但对于“程序要做什么”以及“为什么要这样做”,我们却一无所知。
所以,软件设计的一开始,我们应该避免出现这样的细节化问题,应该把问题放在更高一些的层次,要明白我们应该要做什么。这种层次的思想是从上往下的,相信只要了解OO和软件工程思想的都理解这个概念,这里我就不废话了。
前面所说的这些,都是为了说明为什么要引用“模式”这个概念来设计软件。“软件”发展到现在已经不是独立的一个东东了,像软件工程学的概念也是从建筑工程的思想中引入的,这里的模式也是如此,所以到今天这个时代,软件开发已经不是简单的编写程序能表述的了,其中涉及的思想太多太多,偶还要抓紧时间多学啊~~~HOHO~~
好了,就写这些了,回过头看一下,题目好像有点大了,不过一时想不出什么好点的题目了,就这样凑合着用下嘛,还可以骗下点击率
最后要说明一下,我也是一名初学者,文中的一些看法只是个人对一些观点的理解,也许我所理解的东西还有些肤浅,而且可能还会有些错漏或错误的理解,错误的地方(huang)还望各位大虾指正。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
2006-05-02 感冒还没好,早点回去觉觉了~~~