设计模式之行为型模式三

上传人:fgh****35 文档编号:172625018 上传时间:2022-12-05 格式:DOC 页数:11 大小:112.50KB
返回 下载 相关 举报
设计模式之行为型模式三_第1页
第1页 / 共11页
设计模式之行为型模式三_第2页
第2页 / 共11页
设计模式之行为型模式三_第3页
第3页 / 共11页
点击查看更多>>
资源描述
软件英才网 软件行业驰名招聘网站设计模式之行为型模式三来自何静媛的博客行为型模式:策略模式 它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。简单工厂模式的不足: 由于工厂本身包括了所有的收费方式,商场是可能经常性的更改打折额度和返利额度,每次维护或扩展收费方法都要改动这个工厂,以致代码需重新编译部署,很麻烦方法: 1,定义一个所有支持的算法的公共接口 2,将所有具体算法或行为封装在一起 3,维护对公共接口的引用 客户端代码是将所有的算法实例化这个模式涉及到三个角色: 环境(Context)角色:持有一个Strategy类的引用。 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为优点: 使用策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类(ConcreteStrategy)中提供。由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户端。当出现新的促销折扣或现有的折扣政策出现变化时,只需要实现新的策略类,并在客户端登记即可。策略模式相当于可插入式(Pluggable)的算法个人理解: 策略模式与工厂模式 工厂模式是将需要实例化的所有对象放到一个类中,然后在客户端直接使用工厂的方法,实现不同对象的不同操作策略模式是将工厂中的方法提取出来,然后将需要实例化的对象都放到了客户端去实例。当我需要添加不同的策略时,只在客户端添加它的实例即可,然后将对象作为参数传到策略模式中即可策略模式结构图: 课本实例:商场打折代码如下:csharpview plaincopyprint?1. classcashcontext2. 3. /基类类型的对像4. privateCashSupercs;5. /初始化时(构造函数),传入具体的对象6. publiccashcontext(CashSupercsuper)7. 8. this.cs=csuper;9. /将csuper赋给cs,然后计算cs对象的收到的现金数10. /通过传入参数的不同,计算不同方式的收到现金数11. 12. publicdoublegetresult(doublemoney)13. /根据具体的策略对象,调用其算法的方法14. 15. returncs.acceptCash(money);16. 17. 18. 备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. Memento模式比较适用于功能比较 复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态课本实例:游戏的状态保存代码如下:csharpview plaincopyprint?1. /一个发起人类:有攻击力,生命力,还有创建备忘和恢复备忘的功能等2. classGameRole3. 4. /生命力5. privateintvit;6. publicintVitality7. 8. getreturnvit;9. setvit=value;10. 11. /攻击力12. privateintatk;13. publicintAttack14. 15. getreturnatk;16. setatk=value;17. 18. /防御类19. privateintdef;20. publicintDefense21. 22. getreturndef;23. setdef=value;24. 25. /状态显示26. publicvoidStateDisplay()27. 28. Console.WriteLine(角色当前状态:);29. Console.WriteLine(体力:0,this.vit);30. Console.WriteLine(攻击力:0,this.atk);31. Console.WriteLine(防御类:0,this.def);32. Console.WriteLine();33. 34. /获得初始状态35. publicvoidGetInitState()36. 37. this.vit=100;38. this.atk=100;39. this.def=100;40. 41. /战斗42. publicvoidFight()43. 44. this.vit=0;45. this.atk=0;46. this.def=0;47. 48. /保存角色状态49. publicRoleStateMementoSaveState()50. 51. /保存状态时,创建存储箱52. return(newRoleStateMemento(vit,atk,def);53. 54. /恢复角色状态55. publicvoidRecoveryState(RoleStateMementomemento)56. 57. this.vit=memento.Vitality;58. this.atk=memento.Attack;59. this.def=memento.Defense;60. 61. 62. /一个备忘录类:将要备忘的内容存储在备忘录中63. /角色状态存储箱64. classRoleStateMemento65. 66. privateintvit;67. privateintatk;68. privateintdef;69. /以上是角色状态存储箱的一些属性70. publicRoleStateMemento(intvit,intatk,intdef)71. 72. this.vit=vit;73. this.atk=atk;74. this.def=def;75. 76. 77. /生命力78. publicintVitality79. 80. getreturnvit;81. setvit=value;82. 83. /攻击力84. publicintAttack85. 86. getreturnatk;87. setatk=value;88. 89. /防御力90. publicintDefense91. 92. getreturndef;93. setdef=value;94. 95. /以上是存储箱的一些函数,是指可以对生命力等状态进行读写96. 97. 98. /一个管理者类:将备忘录类进行封装,以便在客户端只需要知道管理者这个类,将备忘的99. /角色状态管理者100. classRoleStateCaretaker101. 102. privateRoleStateMementomemento;103. publicRoleStateMementoMemento104. 105. getreturnmemento;106. setmemento=value;107. 108. 109. 110. /客户端:111. /大战前112. GameRolehejingyuan=newGameRole();113. hejingyuan.GetInitState();114. hejingyuan.StateDisplay();115. 116. /保存进度117. RoleStateCaretakerstateAdmin=newRoleStateCaretaker();118. stateAdmin.Memento=hejingyuan.SaveState();119. /大战时,损耗严重120. hejingyuan.Fight();121. hejingyuan.StateDisplay();122. /恢复之前状态123. hejingyuan.RecoveryState(stateAdmin.Memento);124. hejingyuan.StateDisplay();125. Console.Read();126. 个人理解: 备忘录模式:当我要保存备忘时,再发起人(游戏角色)这个类中就创建备忘录,备忘录这个类中具有要备忘的一些内容(属性和方法)等,管理者是对备忘录进行包装,在客户端将发起人备忘赋给管理者这个对象,这样客户端的人就不需要知道我备忘的是什么内容了。迭代器模式 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式应用: 当你需要对聚集有多种方法遍历时,可以考虑用迭代器模式 总的来说,迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据.课本实例:乘车买票代码如下:csharpview plaincopyprint?1. /Iterator迭代器抽象类2. abstractclassIterator3. 4. publicabstractobjectFirst();5. publicabstractobjectNext();6. publicabstractobjectIsDone();7. publicabstractobjectCurrentItem();8. 9. /迭代器就是对一个聚集对象遍历10. 11. /ConcreteIterator具体迭代器类,继承Iterator12. classConcreteIterator:Iterator13. 14. /创建了一个具体聚集对象15. privateConcreteAggregateaggregate;16. privateintcurrent=0;17. 18. publicConcreteIterator(ConcreteAggregateaggregate)19. 20. this.aggregate=aggregate;21. 22. 23. /初始化时将具体的聚集对象传入24. publicoverrideobjectFirst()25. 26. returnaggregate0;27. 28. publicoverrideobjectNext()29. 30. objectret=null;31. current+;32. if(current=aggregate.Count?true:false;42. 43. publicoverrideobjectCurrentItem()44. 45. returnaggregatecurrent;46. 47. 48. /具体迭代器就是对具体聚集对象的操作,也是对抽象迭代器的重写49. 50. /Aggregate51. abstractclassAggregate52. 53. publicabstractIteratorCreateIterator();54. 55. /抽象聚集类就是要创建迭代器56. 57. /ConcreteAggregate具体聚集类继承Aggregate58. classConcreteAggregate:Aggregate59. 60. privateIListitems=newList();61. publicoverrideIteratorCreateIterator()62. 63. returnnewConcreteIterator(this);64. 65. publicintCount66. 67. getreturnitems.Count;68. 69. publicobjectthisintindex70. 71. getreturnitemsindex;72. set73. 74. items.Insert(index,value);75. 76. 77. 78. 79. /具体聚集类中有用于存放聚合对象的变量,对抽象聚集类重写,还有聚集总数,和声明一个索引器 有需要请联系我们
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 营销创新


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!