zoukankan      html  css  js  c++  java
  • 为什么要引入模式概念来设计软件

          今天读了《设计模式精解》中的设计模式篇,感觉现在才算是对模式有了一定了解。
    在此将一些心得体会和大家交流一下:)

          
          要了解模式首先就要知道什么是模式

          关于什么是模式,官方一点的概念就是:解决相似问题的不同解决方案(或 在某一情景下的问题解决方案)
    也就是说,要解决一个问题,方法不只一种,可以有很多种,就像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)还望各位大虾指正。

  • 相关阅读:
    事件基础
    Event loop 事件的循环和为什么使用函数
    Promise 对象---异步调用
    新版博客园分类不能正常显示
    OpenCV学习
    c# 常用正则
    C#调用OpenCV——美图效果
    WPF中的Image控件Source的设置(包括直接读取图片文件的代码)
    图像处理的灰度化和二值化
    C#弹出U盘
  • 原文地址:https://www.cnblogs.com/Random/p/734764.html
Copyright © 2011-2022 走看看