




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、使市场前段时间看到有人用魔兽来解释设计模式,感觉很有意思,于是我把它改了改,又添加了些设计模式内容,今天发出来。有些地方借鉴了前人的内容,没有注明,请前人不要见怪啊。这里用大大家感兴兴趣的魔魔兽3来来讨论PPHP的的几种常常见的设设计模式式:单件件模式、策略模模式、工工厂模式式、观察察者模式式。今天天就讲这这四个吧吧,以后后继续。这些设计计模式,都是针针对面向向对象来来说的,所以都都用PHHP5,另外在在这里我我想说的的是PHHP4从从20008年88月8日日(我记记得是和和北京奥奥运会同同一天,没查证证,呵呵呵)的时时候官方方就发了了最后一一个PHHP4的的补丁,这意味味这PHHP4的的时代
2、已已经终结结,所以以,我建建议大家家现在就就别理PPHP44吧,就就以PHHP5来来说吧。一、单件件模式:问题的提提出:某些应用用程序资资源是独独占的,因为有有且只有有一个此此类型的的资源。例如,通过数数据库句句柄到数数据库的的连接是是独占的的。您希希望在应应用程序序中共享享数据库库句柄,因为在在保持连连接打开开或关闭闭时,它它是一种种开销,在获取取单个页页面的过过程中更更是如此此。问题的解解决:那么下面面我们就就开始玩玩魔兽吧吧。首先先双击wwar33.exxe,这这时候就就开始运运行魔兽兽了。我我们用代代码来实实现吧。?phhpclasss WWar33 publlic funnctiio
3、n _cconsstruuct()echoo WWar33 iss Ruunniing.,;$warr = neww Waar3();运行!很很好,输输出War33 iss Ruunniing.我们已经经可以开开始游戏戏了,但但是,如如果我在在代码末末尾再加加入$warr2 = neew WWar33();$warr3 = neew WWar33();会怎么样样呢?我我们试试试,输出出结果:War33 iss Ruunniing.War33 iss Ruunniing.War33 iss Ruunniing.完了,如如果不小小心双击击了两次次就开了了3个魔魔兽,那那如果再再双击几几次,那那电脑
4、肯肯定爆掉掉。我们还还是来想想想解决决方法吧吧。既然我们们不能这这么随意意的就把把这个类类实例化化了,那那么我们们就把构构造函数数改成私私有方法法。classs WWar33 privvatee fuuncttionn _connstrructt()echoo WWar33 iss Ruunniing.,;可是私有有变量外外部是无无法访问问的,这这样以来来,我们们就连一一个都打打不开了了啊。别别急,我我们再给给他加一一个不用用通过实实例化,外部也也能访问问的函数数,那就就是静态态函数,classs WWar33 privvatee fuuncttionn _connstrructt()echo
5、o WWar33 iss Ruunniing.,; publlic staaticc fuuncttionn ruunWaar() 通过这个个静态的的方法rrunWWar()我们们来控制制类Waar3的的实例化化,那么么还缺上上一个标标识,我我们再创创建一个个标识,通过这这个标识识来表示示我们的的类是否否已经实实例化,如果实实例化,直接返返回句柄柄就行了了。把类修改改成classs WWar33 prottectted staaticc $_insstannce = nnulll;privvatee fuuncttionn _connstrructt()echoo WWar33 iss Ruu
6、nniing.,; publlic staaticc fuuncttionn ruunWaar()if (nulll = sellf:$_iinsttancce) selff:$_innstaancee = neww seelf();retuurn sellf:$_iinsttancce;当然,我我们运行行魔兽时时的实例例化也要要换种方方法,就就通过$warr = Warr3:runnWarr();就能开始始玩魔兽兽了,好好了,下下面把完完整的代代码附上上来:?phhpclasss WWar33 prottectted staaticc $_insstannce = nnulll;privva
7、tee fuuncttionn _connstrructt()echoo WWar33 iss Ruunniing.,;publlic staaticc fuuncttionn ruunWaar()if (nulll = sellf:$_iinsttancce) selff:$_innstaancee = neww seelf();retuurn sellf:$_iinsttancce;$warr = Warr3:runnWarr();$warr2 = Waar3:ruunWaar();$warr3 = Waar3:ruunWaar();运行一下下,结果果是:War33 iss Ruunnii
8、ng.太好了,我双击击了这么么多次,也就只只运行了了一个魔魔兽,现现在随便便你怎么么打开,机子都都不会爆爆掉了。这就是传传说中的的单价模模式,主主要用于于一些很很占资源源的而且且实例仅仅有一个个实例就就够用的的东西,比如,zennd fframmewoork中中的Zeend_Conntroolleer_FFronnt前端端控制器器,就是是采用单单价模式式来设计计的,大大家有兴兴趣的话话可以看看看那个个。二、策略略模式:问题的提提出:在此模式式中,算算法是从从复杂类类提取的的,因而而可以方方便地替替换。例例如,如如果要更更改搜索索引擎中中排列页页的方法法,则策策略模式式是一个个不错的的选择。思考
9、一一下搜索索引擎的的几个部部分 一一部分遍遍历页面面,一部部分对每每页排列列,另一一部分基基于排列列的结果果排序。在复杂杂的示例例中,这这些部分分都在同同一个类类中。通通过使用用策略模模式,您您可将排排列部分分放入另另一个类类中,以以便更改改页排列列的方式式,而不不影响搜搜索引擎擎的其余余代码。问题的解解决:呵呵,不不讲那么么复杂,刚才魔魔兽好不不容易打打开了,我们还是是玩魔兽兽好了。下面我们们选baattlle,哇哇好多种种族啊,有人族族(Huumann),兽兽族(OORC),暗夜夜精灵族族(Niighyy Ellf),不死族族(Unndeaad)。我选精精灵族(Nigghy Elff),再
10、再选一个个精灵族族和两个个兽族(ORCC),一一个兽族族和我是是一家的的,另一一个精灵灵族和兽兽族是另另一家的的。每一个玩玩家在进进入游戏戏后都会会得到一一些资源源,如一一个大厅厅,五个个小精灵灵(苦工工)和一一个矿山山。这些些可以称称为是初初始化的的一些东东西,这这里我们们就可以以用到策策略模式式来封装装这些初初始化。进入正题题,首先先我们来来构建一一个玩家家类:racce = $rracee;/_gett()方方法用来来获取保保护属性性privvatee fuuncttionn _gett($pproppertty_nnamee)if(iisseet($thiis-$prropeertyy
11、_naame) retuurn($thhis-$pproppertty_nnamee);elsee retuurn(NULLL);/_sett()方方法用来来设置保保护属性性privvatee fuuncttionn_sset($prropeertyy_naame,$vaaluee)$thiis-$prropeertyy_naame=$vaaluee;接着,我我们再建建一个玩玩家初始始化的接接口,?phhpinteerfaace iniitiaalPllayeer/制造造初始化化的部队队publlic funnctiion givveArrmy($pllayeer);/制造造初始化化的建筑筑p
12、ubllic funnctiion givveBuuilddingg($pplayyer);/初始始化资源源publlic funnctiion givveSoourcce($plaayerr);好了,到到这里我我们就该该对这个个接口来来实现了了,为了了方便,我只选选了两个个种族,就只写写这两个个种族的的初始化化了:首先是精精灵族:?phhpclasss NNighhyEllfInnitiial impplemmentts iinittiallPlaayerr/制造造初始化化的部队队publlic funnctiion givveArrmy($pllayeer)/五个个小精灵灵for($i=0
13、; $iaarmyy = $creeatoor-Creeat(Wiisp,./Arrms/);/制造造初始化化的建筑筑publlic funnctiion givveBuuilddingg($pplayyer)$creeatoor = neew CCreaatBuuilddinggs();/一个个基地$plaayerr-bbuilldinng = $crreattor-Crreatt(TTownnHalll,./Buiildiingss/);/一个个矿场$plaayerr-bbuilldinng = $crreattor-Crreatt(MMinee,./BBuilldinngs/);/初始始
14、化人口口上限publlic funnctiion givveSoourcce($plaayerr)$plaayerr-ppopuulattionn= 110;$plaayerr-ggoldd= 110000;$plaayerr-wwoodd= 1100;接下来是是兽族:?phhpclasss OORCIInittiall immpleemennts iniitiaalPllayeer/制造造初始化化的部队队publlic funnctiion givveArrmy($pllayeer)/五个个苦工for($i=0; $iaarmyy = $creeatoor-Creeat(Peeon,./Ar
15、rms/);/制造造初始化化的建筑筑publlic funnctiion givveBuuilddingg($pplayyer)$creeatoor = neew CCreaatBuuilddinggs();/一个个基地$plaayerr-bbuilldinng = $crreattor-Crreatt(TTownnHalll,./Buiildiingss/);/一个个矿场$plaayerr-bbuilldinng = $crreattor-Crreatt(MMinee,./BBuilldinngs/);/初始始化人口口上限publlic fu ncttionn giiveSSourrce($
16、pllayeer)$plaayerr-ppopuulattionn= 110;$plaayerr-ggoldd= 110000;$plaayerr-wwoodd= 1100;好了,到到这里初初始化代代码就写写好了,现在还还差一个个控制这这些初始始化得类类,也就就是封装装他们:raace)casee NNighhyEllf:$iniitiaalCoontrrolller = nnew NigghyEElfIInittiall();breeak;casee OORC:$iniitiaalCoontrrolller = nnew ORCCIniitiaal();brreakk;$iniitiaalC
17、oontrrolller-giiveAArmyy($pplayyer);$iniitiaalCoontrrolller-giiveBBuilldinng($plaayerr);$iniitiaalCoontrrolller-giiveSSuppply($pllayeer);最后就是是简单这这么一调调用,就就OK:?phhp/有两两个精灵灵族两个个兽族$plaayerrArrray = aarraay(nnew plaayerr(NNighhyEllf), nnew plaayerr(NNighhyEllf), nnew plaayerr(OORC), neww pllayeer(ORCC);/
18、进行行初始化化工作$iniitiaalCoontrrolller = nnew iniitiaalCoontrrolller($pllayeerArrrayy);这就是策策略模式式,他将将不同情情况下的的算法封封装在一一起。ZZendd frrameeworrk中的的Zennd_AAppllicaatioon_RResoourcce就是是用策略略模式来来设计的的。三、工厂厂模式:问题的提提出:最初在设设计模式式一书中中,许多多设计模模式都鼓鼓励使用用松散耦耦合。要要理解这这个概念念,让我我们最好好谈一下下许多开开发人员员从事大大型系统统的艰苦苦历程。在更改改一个代代码片段段时,就就会发生生问题
19、,系统其其他部分分 您曾曾认为完完全不相相关的部部分中也也有可能能出现级级联破坏坏。该问题在在于紧密密耦合。系统某某个部分分中的函函数和类类严重依依赖于系系统的其其他部分分中函数数和类的的行为和和结构。您需要要一组模模式,使使这些类类能够相相互通信信,但不不希望将将它们紧紧密绑定定在一起起,以避避免出现现联锁。在大型系系统中,许多代代码依赖赖于少数数几个关关键类。需要更更改这些些类时,可能会会出现困困难。例例如,假假设您有有一个从从文件读读取的 Useer 类类。您希希望将其其更改为为从数据据库读取取的其他他类,但但是,所所有的代代码都引引用从文文件读取取的原始始类。这这时候,使用工工厂模式式
20、会很方方便。工厂模式式是一种种类,它它具有为为您创建建对象的的某些方方法。您您可以使使用工厂厂类创建建对象,而不直直接使用用 neew。这这样,如如果您想想要更改改所创建建的对象象类型,只需更更改该工工厂即可可。使用用该工厂厂的所有有代码会会自动更更改。问题的解解决:呵呵,估估计有些些phpper没没看懂吧吧,没关关系,那那是我从从其他地地方抄的的,我们们下面还还是通过过魔兽来来进行吧吧。这一一部分,我看都都已经有有前人写写好了,我就基基本上照照抄了,请前人人不要见见怪啊。呵呵。前面选了了暗夜精精灵族(Nigghy Elff),和和兽族(ORCC),因因为小精精灵(WWispp)能建建造建筑筑
21、,还能能自爆。所以根根据这个个我们下下面先写写个小精精灵(WWispp)的类类。?phhpclasss WWisppprivvatee $mmHeaalthhPoiint = 1120;/这这是小精精灵的血血量privvatee $mmArmmor = 00;/这是小小精灵的的护甲/小精精灵能建建造建筑筑publlic funnctiion Buiild()echoo 精精灵建造造建筑咯咯。;/每个个小精灵灵被造出出来时还还会占用用一个人人口publlic funnctiion _cconsstruuct()echoo 你你已经建建造了一一个小精精灵。;/这里里是增加加已有人人口的代代码/每个
22、个小精灵灵死亡会会减少你你占用的的人口publlic funnctiion _ddesttrucct()/这里里是减少少已有人人口的代代码把这些代代码放在在Armms/ Wissp.pphp中中。啊,还有有还有,还有苦苦工(PPeonn)的类类?phhpclasss PPeonnprivvatee $mmHeaalthhPoiint = 2250;/这这是苦工工的血量量privvatee $mmArmmor = 00;/这是苦苦工的护护甲 /苦工工能建造造建筑publlic funnctiion Buiild()echoo 苦苦工建造造建筑咯咯。; /每个个苦工被被造出来来时还会会占用一一个人
23、口口publlic funnctiion _cconsstruuct()echoo 你你已经建建造了一一个苦工工。;/这里里是增加加已有人人口的代代码/每个个苦工死死亡会减减少你占占用的人人口publlic funnctiion _ddesttrucct()/这里里是减少少已有人人口的代代码把这些代代码放在在Armms/ Peoon.pphp中中。等等,这这样岂不不是很复复杂,魔魔兽里面面还有那那么多的的兵种,另外都都还有两两个种族族,每次次创建一一个兵就就要neew一个个,要是是记不住住这个兵兵的类名名,岂不不是neew不了了?而且且如果一一个兵是是一个类类,放在在一个文文件里,那是不不是一
24、开开始就要要把所有有的几十十上百个个文件都都inccludde一次次啊,那那效率可可想而知知啊。嘿嘿,当当然是有有解决办办法的啊啊,我们们再写一一个类把把这些类类都封装装起来,这个把把兵种都都封装起起来的类类我们称称之为工工厂类,他可以以像生产产产品一一样,来来创建兵兵,帮我我们对其其实例化化。下面面我们就就来看这这个类怎怎么实现现吧。Creeat(兵种种名,前缀缀或路径径);例如创建建小精灵灵:$creeatoor = neew CCreaatArrms();/不管管创建啥啥,我都都只要使使用这个个类$w1 = $creeatoor-Creeat(Wissp,./AArmss/);/创建建一
25、个小小精灵$w1-Buuildd();/让让小精灵灵造建筑筑这就是传传说中的的工厂模模式,通通过工厂厂模式,对于如如论坛那那种有很很多种用用户的,特别是是为了以以后扩展展比较方方便的,采用工工厂模式式,是个个很好的的解决方方法。在在zennd fframmewoork中中的Zeend_Forrm、ZZendd_Fiilteer、ZZendd_Vaaliddatee就是用用工厂模模式来构构架的。四、观察察者模式式:问题的提提出:观察者模模式为您您提供了了避免组组件之间间紧密耦耦合的另另一种方方法。该该模式非非常简单单:一个个对象通通过添加加一个方方法(该该方法允允许另一一个对象象,即观观察者 注
26、册自自己)使使本身变变得可观观察。当当可观察察的对象象更改时时,它会会将消息息发送到到已注册册的观察察者。这这些观察察者使用用该信息息执行的的操作与与可观察察的对象象无关。结果是是对象可可以相互互对话,而不必必了解原原因。问题的解解决:呵呵,上上面还是是抄的,看不懂懂没关系系,我们们今天重重点是玩玩魔兽。已经造了了很长时时间的兵兵了,现现在可以以出去带带兵打仗仗了,如如果我去去打电脑脑的兽族族,那么么电脑与与那个兽兽族同盟盟的精灵灵族就会会过来帮帮忙。那那么如何何让他知知道自己己的同盟盟受攻击击了呢。现在我我们就来来讨论这这个问题题。首先我们们写一下下结盟的的抽象类类:obeerseerveerCoolleectiion = neew ooberrserrverr($ooberrserrverr);/将被被攻击的的电脑的的名字通通知各个个观察者者publlic funnctiion nottifyy($bbeAtttacckeddPlaayerrNamme)/把观观察者的的集合循循环foreeachh ($thiis-obeerseerveerCoolle
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 8 Around the world说课稿小学英语Level 6剑桥国际少儿英语(第二版)
- 2025年潮州市法院系统招聘真题
- 2024年河南省文化旅游投资集团有限公司权属企业招聘笔试真题
- 高中基本能力 《非洲你好》说课说课稿
- 宣威事业单位笔试真题2025
- 2024-2025学年学年高二地理 南方地区说课稿
- 2025年滨州市法院系统招聘真题
- 2025年浙江国家公务员行测考试真题及答案
- 第2课 如何鉴赏美术作品教学设计高中美术人教版2019必修 美术鉴赏-人教版2019
- 图像特征自适应选择技术-洞察及研究
- 建筑设计行业2024年财务挑战解析
- 慢性病防治健康教育知识讲座
- 中国石化加油站视觉形象(VI)标准手册-课件
- 小学数学新旧知识关联
- 退费账户确认书
- 国家开放大学《政治学原理》章节自检自测题参考答案
- 小学五年级道德与法治(上册)月考试卷及答案(一套)
- 恒瑞医药简介课件
- GB/T 20671.4-2006非金属垫片材料分类体系及试验方法第4部分:垫片材料密封性试验方法
- 灌肠分类、操作及并发症处理
- FZ/T 74003-2014击剑服
评论
0/150
提交评论